据我所知,没有这样的捷径。不过,你还有一些选择。
直接语法
使用Copy
类型(整数为Copy
)初始化数组的直接语法如下:
let array = [0; 1024];
用所有0初始化一个包含1024个元素的数组。
基于此,您随后可以修改该数组:
let array = {
let mut array = [0; 1024];
array[0] = 7;
array[1] = 8;
array
};
注意使用块表达式将可变性隔离到代码的较小部分的技巧;我们将在下面重复使用它。
切片语法
有一种基于clone_from_slice
的缩写形式。
let array = {
let mut array = [0; 32];
array[..2].clone_from_slice(&[7, 8]);
array
};
迭代器语法
还支持从迭代器初始化数组:
let array = {
let mut array = [0; 1024];
for (i, element) in array.iter_mut().enumerate().take(2) {
*element = (i + 7);
}
array
};
而且你甚至可以(可选地)从未初始化的状态开始,使用 unsafe
块:
#![feature(maybe_uninit_uninit_array)]
let array = {
let mut array: [MaybeUninit<i32>; 10] = MaybeUninit::uninit_array();
let nonzero = 2;
for (i, element) in array.iter_mut().enumerate().take(nonzero) {
element.write(i + 7)
}
for element in array.iter_mut().skip(nonzero) {
element.write(0)
}
unsafe { MaybeUninit::array_assume_init(array) }
};
mem::uninitialized()
,因为它已经被弃用(而且不安全),并且修复了clone_from_slice
片段=>“目标”切片需要与源切片具有完全相同的长度,正如您所指出的那样。 - Matthieu M.