在C中,我可以写int foo[100] = { 7, 8 };,我会得到[7, 8, 0, 0, 0...].
这允许我在数组的开头显式地和简明地选择连续元素组的初始值,并且剩余部分将被初始化,就好像它们具有静态存储持续时间(即,到适当类型的零值).
Rust中有等价物吗?
Mat*_* M. 12
据我所知,没有这样的捷径.不过,你确实有几个选择.
直接的语法
初始化数组的直接语法适用于Copy类型(整数Copy):
let array = [0; 1024];
Run Code Online (Sandbox Code Playgroud)
使用全0来初始化1024个元素的数组.
基于此,您可以在以后修改数组:
let array = {
let mut array = [0; 1024];
array[0] = 7;
array[1] = 8;
array
};
Run Code Online (Sandbox Code Playgroud)
注意使用块表达式将可变性隔离到代码的较小部分的技巧; 我们将在下面重复使用它.
迭代器语法
还支持从迭代器初始化数组:
let array = {
let mut array = [0; 1024];
for (i, element) in array.iter_mut().enumerate().take(2) {
*element = (i + 7);
}
array
};
Run Code Online (Sandbox Code Playgroud)
您甚至可以(可选)使用unsafe块从未初始化状态开始:
let array = unsafe {
// Create an uninitialized array.
let mut array: [i32; 10] = mem::uninitialized();
let nonzero = 2;
for (i, element) in array.iter_mut().enumerate().take(nonzero) {
// Overwrite `element` without running the destructor of the old value.
ptr::write(element, i + 7)
}
for element in array.iter_mut().skip(nonzero) {
// Overwrite `element` without running the destructor of the old value.
ptr::write(element, 0)
}
array
};
Run Code Online (Sandbox Code Playgroud)
迭代器语法越短
有一种较短的形式,基于此clone_from_slice,它目前不稳定.
#![feature(clone_from_slice)]
let array = {
let mut array = [0; 32];
// Override beginning of array
array.clone_from_slice(&[7, 8]);
array
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
741 次 |
| 最近记录: |