Rustで以下のようなenumが用意されていて
pub enum ResistorColor { Black, Brown , Red , }
次のようなテストをパスするcolors()
関数を作るという問題を解いているとき
#[test] fn test_all_colors() { use ResistorColor::*; assert_eq!( colors(), vec![Black, Brown, Red] ); }
そもそも期待値のvec!
がよくわからなかったので調べた
vec!
はベクタと呼ばれるメモリ上に値の列を表現する方法の初期化を便利にするマクロで以下のように使うみたい
let mut vec = vec![1, 2, 3]; vec.push(4); assert_eq!(vec, [1, 2, 3, 4]);
これは以下と同等となる
let mut vec = Vec::new(); vec.push(1); vec.push(2); vec.push(3); vec.push(4); assert_eq!(vec, [1, 2, 3, 4]);
使い方をみるとJavaScriptのArrayのような使い方に似ている
ただ、push
するにはlet mut
にしてミュータブルにする必要があるみたい
配列との違い
メモリ上に値の列を表現する方法は他にも2つあり、その一つに配列がある
Rustは初期化されてない値にアクセスしないことを保証するために初期化なしで配列を作る記法はない
そのため、配列をつくるときは必ず配列の長さを指定する必要があり、それは型の一部になっている
let lazy_caterer: [u32, 6] = [1, 2, 3, 4, 7, 11, 16];
これはつまり、例えば、nが変数だとして[u32; n]
のように書くことはできない
ということで、実行時に長さを変更できる配列をつくる場合にはベクタを使うことになる(pushなど)
これが主な配列との違い
ベクタも要素数が事前にわかるならバッファを確保をしておいた方がよく
Vec::new
ではなくVec::with_capacity
を使うことを意識する
メモリ上に値の列を表現する方法の最後の一つはスライスというらしいが長いので後日調べる