UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【Rust】配列とベクタ

Rustで以下のようなenumが用意されていて

pub enum ResistorColor {
    Black,
    Brown ,
    Red ,
}

次のようなテストをパスするcolors()関数を作るという問題を解いているとき

#[test]
fn test_all_colors() {
    use ResistorColor::*;
    assert_eq!(
        colors(),
        vec![Black, Brown, Red]
    );
}

そもそも期待値のvec!がよくわからなかったので調べた

moshg.github.io

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を使うことを意識する

メモリ上に値の列を表現する方法の最後の一つはスライスというらしいが長いので後日調べる