有没有办法不必两次初始化数组?

问题描述:

我需要将数组的每个元素初始化为一个非常量表达式。我能做到这一点,而不必首先初始化数组中的每个元素来表达一些无意义的表达?这里是希望我能够做一个例子:有没有办法不必两次初始化数组?

fn foo(xs: &[i32; 1000]) { 
    let mut ys: [i32; 1000]; 

    for (x, y) in xs.iter().zip(ys.iter_mut()) { 
     *y = *x/3; 
    } 
    // ... 
} 

该代码给出了编译时错误:

error[E0381]: use of possibly uninitialized variable: `ys` 
--> src/main.rs:5:37 
    | 
5 |   for (x, y) in xs.iter().zip(ys.iter_mut()) { 
    |          ^^ use of possibly uninitialized `ys` 

要解决这个问题,我需要改变的第一线功能与像这样一些虚拟值初始化的ys元素:

let mut ys: [i32; 1000] = [0; 1000]; 

有没有办法省略掉额外的初始化?包装unsafe区块中的所有内容似乎没有任何区别。

使用std::mem::uninitialized

let mut ys: [i32; 1000] = unsafe { std::mem::uninitialized() }; 

这是不安全的,因为访问未初始化的值是不确定的锈行为和编译器不能保证被读取之前的ys每个值都将被初始化。

cannot collect into an array,但如果你有一个Vec相反,你可以这样做:

let ys: Vec<_> = xs.iter().map(|&x| x/3).collect(); 

为了您的具体问题,你也可以克隆传入的数组,然后变异它:

let mut ys = xs.clone(); 
for y in ys.iter_mut() { *y = *y/3 }