在C中,我可以写int foo[100] = { 7, 8 };
,我会得到[7, 8, 0, 0, 0...]
。
这允许我在数组的开头显式地和简明地选择连续元素组的初始值,并且剩余部分将被初始化,就好像它们具有静态存储持续时间(即,到适当类型的零值)
Rust中有等效的吗?
答案 0 :(得分:12)
据我所知,没有这样的捷径。不过,你确实有几个选择。
直接语法
初始化数组的直接语法适用于Copy
类型(整数为Copy
):
let array = [0; 1024];
使用全0来初始化1024个元素的数组。
基于此,您可以在以后修改数组:
let array = {
let mut array = [0; 1024];
array[0] = 7;
array[1] = 8;
array
};
注意使用块表达式将可变性隔离到代码的较小部分的技巧;我们将在下面重复使用它。
迭代器语法
还支持从迭代器初始化数组:
let array = {
let mut array = [0; 1024];
for (i, element) in array.iter_mut().enumerate().take(2) {
*element = (i + 7);
}
array
};
您甚至可以(可选)使用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
};
迭代器语法越短
根据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
};
答案 1 :(得分:2)
这是宏
macro_rules! array {
($($v:expr),*) => (
{
let mut array = Default::default();
{
let mut e = <_ as ::std::convert::AsMut<[_]>>::as_mut(&mut array).iter_mut();
$(*e.next().unwrap() = $v);*;
}
array
}
)
}
fn main() {
let a: [usize; 5] = array!(7, 8);
assert_eq!([7, 8, 0, 0, 0], a);
}