在 C 中,我可以编写 int foo[100] = { 7, 8 };
我会得到 [7, 8, 0, 0, 0...]
.
这使我可以明确而简洁地为数组开头的一组连续元素选择初始值,其余元素将被初始化,就好像它们具有静态存储持续时间一样(即适当类型的零值) .
Rust 中是否有等效项?
最佳答案
据我所知,没有这样的捷径。不过,您确实有一些选择。
直接语法
初始化数组的直接语法适用于 Copy
类型(整数是 Copy
):
let array = [0; 1024];
用全 0 初始化一个包含 1024 个元素的数组。
基于此,您可以事后修改数组:
let array = {
let mut array = [0; 1024];
array[0] = 7;
array[1] = 8;
array
};
注意使用 block 表达式将可变性隔离到代码的较小部分的技巧;我们将在下面重用它。
迭代器语法
还支持从迭代器初始化数组:
let array = {
let mut array = [0; 1024];
for (i, element) in array.iter_mut().enumerate().take(2) {
*element = (i + 7);
}
array
};
你甚至可以(可选)从未初始化的状态开始,使用 unsafe
block :
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
};
关于rust - Rust 中的显式部分数组初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32452708/