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

标签 rust

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

相关文章:

rust - move 原始实例后,不会反射(reflect)使用字段可变引用的更改

rust - 迭代同一文件的行后,迭代文件的字节为空

rust - 将 TOML 反序列化为具有值的枚举向量

cookies - 在与 Hyper 的交易之间保留 cookie

rust - 为什么我不能返回从字符串生成的 &str 值?

rust - 为什么 Rust Closure 在被调用之前就拥有所有权

types - 如何在 Rust 中创建包装向量的新实例?

json - 读入json文件,写入不缩进

multithreading - Rust 程序可以生成的最大线程数是多少?

memory - 如何将拥有的盒子发送给子任务?