本文へスキップ
BecomeCoder

Rustコース · 第8章 コレクションとエラー処理 · レッスン31

Vec ― 可変長の配列

ブラウザで完結

導入

第1章の配列は要素数が固定でした。実際には「後から要素を追加していく」ことがほとんどです。それを担うのが Vec<T>(ベクタ)——ヒープ上に確保される、伸び縮み自由な配列です。第3章で見た「スタックに管理情報、ヒープに実データ」の構造を持つ代表例です。

説明

fn main() {
    let mut v: Vec<i32> = Vec::new();   // 空のベクタ
    v.push(10);                          // 末尾に追加
    v.push(20);
    v.push(30);

    // vec! マクロで初期値付きで作るのが手軽
    let mut nums = vec![1, 2, 3];
    nums.push(4);

    println!("{:?}", nums);              // [1, 2, 3, 4]
    println!("要素数: {}", nums.len());

    // 添字アクセス(範囲外はパニック)と、安全な get(Option を返す)
    println!("先頭: {}", nums[0]);
    match nums.get(10) {
        Some(v) => println!("{v}"),
        None => println!("範囲外"),
    }

    // 全要素をたどる
    for n in &nums {                     // &nums で借りてループ(所有権を奪わない)
        print!("{n} ");
    }
    println!();
}
  • Vec::new() または vec![...] で作成。要素を足すには mut が必要です。
  • push で末尾に追加、nums[0] で添字アクセス、getOption を返す安全版(第7章)。
  • for n in &nums& を付けて借用ループします。& なしだと nums の所有権がループにムーブしてしまい、以後使えなくなります。ここでも所有権の知識が効いてきます。

Vec は要素が増えてヒープの容量(capacity)が足りなくなると、より大きな領域を確保して自動で引っ越します。この面倒を Vec が引き受けてくれるので、私たちは push するだけで済みます。

試すには

for n in nums& なし)と書くと nums がムーブして、ループ後に nums を使えなくなります。for n in &nums にすると借用なので後でも使えます。コレクションのループでは「借りるか、渡すか」を意識する癖をつけましょう。

実際に動かしてみよう

下のエディタにRustを書いて「実行」を押すと、学習用シミュレータが println! の出力を表示します(本物のrustcではなく、教材の範囲を再現した軽量エンジンです)。struct・enum・match・トレイト・Vec/String/HashMap・Option/Result なども動きます。本文の例を書き換えて動かしてみましょう(所有権・借用チェッカーのコンパイルエラーは再現しないため、動きの確認用として使ってください)。

Rust — ブラウザ内で実行(学習用シミュレータ)

Rustの教材サブセットを動かす学習用シミュレータを読み込みます(本物のrustcではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。