2015-09-08 17 views
9

W języku C można napisać int foo[100] = { 7, 8 };, a otrzymam [7, 8, 0, 0, 0...].Jawna inicjalizacja częściowej macierzy w Rust

Pozwala mi to jednoznacznie i zwięźle wybrać początkowe wartości dla sąsiedniej grupy elementów na początku tablicy, a pozostała część zostanie zainicjowana tak, jakby miała stały czas przechowywania (tj. Do wartości zerowej odpowiedniego typu).

Czy istnieje odpowiednik w Rust?

Odpowiedz

12

Zgodnie z moją wiedzą, nie ma takiego skrótu. Ale masz kilka opcji.


Bezpośrednie składni

Bezpośrednie składni zainicjować szereg współpracuje z Copy typów (całkowite są Copy)

let array = [0; 1024]; 

inicjuje tablicę 1024 elementów ze wszystkimi 0s.

Na tej podstawie można następnie modyfikować tablicy:

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

Uwaga sztuczka z użyciem wyrażenia bloku do izolowania zmienność do mniejszej części kodu; użyjemy go poniżej.


Składnia iterator

Istnieje również wspierać zainicjować tablicę z iteratora:

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

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

    array 
}; 

I można nawet (opcjonalnie) zaczynają się od stanu niezainicjowanych, używając blok unsafe:

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

Krótsza iterator składnia

Jest krótsza forma, na podstawie clone_from_slice, to jednak obecnie niestabilny.

#![feature(clone_from_slice)] 

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

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

    array 
}; 
2

Oto makro

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