スポンサーリンク

Rustやってみる(7) 配列を使ってみる

配列にはいくつか種類があるらしい。

・[T;N] ... スタック上に固定長配列

・Vec<T> ヒープ上の可変長配列

・Box<[T;N]>ヒープ上に固定長配列

注意点として、基本的に配列の要素は全て初期化しなければならない。可変長配列でcapacityを指定できるVecはともかく、それ以外をメモリ確保だけして初期化したくない場合には、std::mem::MaybeUninitを使わなければならない。これはunsafeで囲まなければならない。

fn main() {

  ////////////////////////////////////////////
  // 固定長配列(スタック)
  let mut ary1:[i32;5]=[1,2,3,4,5];

  for a1 in ary1{
    print!("{} ",a1);
  }
  println!("");

  // 初期化しないバージョン
  let mut ary2:[i32;5]  = unsafe { std::mem::MaybeUninit::uninit().assume_init() };
  for a2 in ary2{
    println!("* {} ",a2);
  }
  println!("\n");

//////////////////////////////////////////// // 可変長配列
  let mut vec1:Vec<&str> = vec!["a", "b", "c"];
  vec1.push("d");
  for v1 in vec1{
    print!("{} ",v1);
  }
  println!("");

  // 初期化しないバージョン
  let mut vec2:Vec<&str> = vec![];
  vec2.push("d");
  for v2 in vec2{
    print!("* {} ",v2);
  }
  println!("\n");

  ////////////////////////////////////////////
  // 固定長配列(ヒープ)
  let mut box1:Box<[f32;5]> = Box::new([10.5 , 11.5 , 12.5 , 13.5 , 14.5]);
  for b1 in box1.iter(){
    print!("{} ",b1);
  }
  println!("");

  // 初期化しないバージョン
  let mut box2:Box<[f32;5]> = Box::new(unsafe { std::mem::MaybeUninit::uninit().assume_init() } );
  for b2 in box2.iter(){
    println!("* {} ",b2);
  }
}

実行例

初期化しなければ不正な値が入っていることを確認できた。

 

1 2 3 4 5
* 112
* 0
* -580595040
* 367
* -580614544


a b c d
* d

10.5 11.5 12.5 13.5 14.5
* 2
* 0
* -1030514000000000000
* 0.000000000000000000000000000000000000000000514
* 0.000000000000000000000000000000000000000000006

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: