Rust中的显式部分数组初始化

Isk*_*rak 9 rust

在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)