2014-10-03 82 views
9

我需要將數組的每個元素初始化爲一個非常量表達式。我能做到這一點,而不必首先初始化數組中的每個元素來表達一些無意義的表達?這裏是希望我能夠做一個例子:有沒有辦法不必兩次初始化數組?

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區塊中的所有內容似乎沒有任何區別。

回答

11

使用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 } 
相關問題