2015-09-08 68 views
9

Cでは、int foo[100] = { 7, 8 };と書くことができ、[7, 8, 0, 0, 0...]となります。Rustの明示的な部分配列の初期化

これにより、配列の先頭に隣接する要素のグループの初期値を明示的かつ簡潔に選択することができ、残りは静的な記憶期間(つまり、適切な型のゼロ値)があるかのように初期化されます)。

錆に相当するものはありますか?

答えて

12

私の知る限り、このようなショートカットはありません。しかし、いくつかの選択肢があります。アレイを初期化する


直接構文

直接構文はCopyタイプ(整数Copyある)と連動:

let array = [0; 1024]; 

はすべて0 1024個の要素の配列を初期化します。

これに基づいて、その後の配列を変更することができる:

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

注コードの小さな部分に可変性を単離するために、ブロック式を使用してのトリック。私たちはそれを下に再利用します。


イテレータの構文

もあり、イテレータから配列を初期化するためにサポートしています。

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

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

    array 
}; 

あなたも(オプション)を使用して、初期化されていない状態から開始することができます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 
}; 

短いイテレータの構文

clone_from_sliceに基づく短い形式は、ありますが、それはしかし、現在、不安定です。ここで

#![feature(clone_from_slice)] 

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

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

    array 
}; 
2

はマクロです

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