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

时间:2015-09-08 08:21:14

标签: rust

在C中,我可以写int foo[100] = { 7, 8 };,我会得到[7, 8, 0, 0, 0...]

这允许我在数组的开头显式地和简明地选择连续元素组的初始值,并且剩余部分将被初始化,就好像它们具有静态存储持续时间(即,到适当类型的零值)

Rust中有等效的吗?

2 个答案:

答案 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);
}