2014-10-03 16 views
9

Dizinin her öğesini sabit olmayan bir ifadeye başlatmalıyım. Dizinin her bir elemanını ilk önce anlamsız bir ifadeye başlatmadan yapabilir miyim?Dizileri iki kez başlatmaya gerek yok mu?

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

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

Bu kod derleme zamanı hatası verir:

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` 

ben ilk satırını değiştirmek gerekir sorunu çözmek için İşte yapabilmek ne istiyorsunuz bir örnek fonksiyon öylesine gibi bazı model değerlerle ys unsurlarını başlatmak için: bu ekstra başlatma atlamak için herhangi bir yolu

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

var mı? unsafe bloğunda her şeyi sarmak, herhangi bir fark yaratmıyor gibi görünüyor.

cevap

11

Kullanım std::mem::uninitialized:

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

başlatılmamış değerlere erişim Rust tanımsız davranıştır ve derleyici artık okunduğunda önce ys her değeri başlatıldı olacağını garanti edemez, çünkü bu güvenli değildir.

You cannot collect into an array, ancak bunun yerine Vec olsaydı, bunu yapabilirsiniz:

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

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

Özgül sorun için, ayrıca bunu mutasyona sonra gelen dizi klonlamak ve olabilir