2015-09-08 6 views
9

C, int foo[100] = { 7, 8 }; yazabilirim ve [7, 8, 0, 0, 0...] alacağım.Rust'ta açık kısmi dizi başlatımı

Bu, dizinin başında bitişik bir öğe grubu için başlangıç ​​değerlerini açık ve öz bir şekilde seçmeme izin verir ve geri kalanlar statik depolama süresi (örneğin, uygun türde sıfır değerine) sahipmiş gibi başlatılır).

Rust'ta bir eşdeğer var mı?

cevap

12

Bildiğim kadarıyla, böyle bir kısayol yoktur. Yine de birkaç seçeneğin var.


doğrudan sözdizimi

bir dizi Copy türleri ile çalışır başlatmak için doğrudan sözdizimi (tamsayı Copy gösterilmiştir):

let array = [0; 1024]; 

tüm 0s 1024 elemanlarının, bir dizi başlatır. Buna dayanarak

, sonradan bir dizi değiştirebilir:

let array = { 
    let mut array = [0; 1024]; 
    array[0] = 7; 
    array[1] = 8; 
    array 
}; 

Not kodu daha küçük bir bölümüne değişebilirlik izole etmek için bir blok ifade kullanarak hile; Bunu aşağıda tekrar kullanacağız.


yineleyici sözdizimi

Orada da bir yineleyici bir diziyi başlatmak için destekleyen edilir:

let array = { 
    let mut array = [0; 1024]; 

    for (i, element) in array.iter_mut().enumerate().take(2) { 
     *element = (i + 7); 
    } 

    array 
}; 

Ve hatta (isteğe bağlı) kullanarak, başlatılmamış durumundan başlayabilir Bir unsafe blok:

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 
}; 

kısa yineleyici sözdizimi

clone_from_slice dayanan kısa formu vardır, bununla birlikte şu anda kararsız. İşte

#![feature(clone_from_slice)] 

let array = { 
    let mut array = [0; 32]; 

    // Override beginning of array 
    array.clone_from_slice(&[7, 8]); 

    array 
}; 
2

makro olduğunu

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