配列にはいくつか種類があるらしい。
・[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