ベクタ

「ベクタ」は動的な、または「拡張可能な」配列です、標準ライブラリ上で Vec<T> として提供されています。 T はどんなタイプのベクタをも作成することが可能なことを意味しています。(詳細はジェネリクスを御覧ください) ベクタはデータを常にヒープ上にアロケーションします。 ベクタは以下のように vec! マクロを用いて作成できます:

fn main() { let v = vec![1, 2, 3, 4, 5]; // v: Vec<i32> }
let v = vec![1, 2, 3, 4, 5]; // v: Vec<i32>

(以前使ったprintln! マクロと異なり、vec! マクロで 角括弧 [] を利用しました。) Rustではどちらの括弧もどちらのシチュエーションでも利用可能であり、解りやすさのためです。

vec! には初期値の繰り返しを表現するための形式があります:

fn main() { // let v = vec![0; 10]; // ten zeroes let v = vec![0; 10]; // 0が10個 }
let v = vec![0; 10]; // 0が10個

要素へのアクセス

ベクタ中の特定のインデックスの値にアクセスするには [] を利用します:

fn main() { let v = vec![1, 2, 3, 4, 5]; println!("The third element of v is {}", v[2]); }
let v = vec![1, 2, 3, 4, 5];

println!("The third element of v is {}", v[2]);

インデックスは 0 から始まります、なので三番目の要素は v[2] となります。

また、インデックスは usize 型でなければならない点に注意しましょう:

fn main() { let v = vec![1, 2, 3, 4, 5]; let i: usize = 0; let j: i32 = 0; // // works // これは動作します v[i]; // // doesn’t // 一方、こちらは動作しません v[j]; }
let v = vec![1, 2, 3, 4, 5];

let i: usize = 0;
let j: i32 = 0;

// これは動作します
v[i];

// 一方、こちらは動作しません
v[j];

usize 型でないインデックスを用いた場合、以下の様なエラーが発生します:

error: the trait `core::ops::Index<i32>` is not implemented for the type
`collections::vec::Vec<_>` [E0277]
v[j];
^~~~
note: the type `collections::vec::Vec<_>` cannot be indexed by `i32`
error: aborting due to previous error

エラーメッセージ中には多くの点が含まれていますが、一番大切な部分は i32 をインデックスとして用いることはできないという点です。

イテレーティング

ベクタである値に対して for を用いて以下の様な3つの方法でイテレートすることができます:

fn main() { let mut v = vec![1, 2, 3, 4, 5]; for i in &v { println!("A reference to {}", i); } for i in &mut v { println!("A mutable reference to {}", i); } for i in v { println!("Take ownership of the vector and its element {}", i); } }
let mut v = vec![1, 2, 3, 4, 5];

for i in &v {
    println!("A reference to {}", i);
}

for i in &mut v {
    println!("A mutable reference to {}", i);
}

for i in v {
    println!("Take ownership of the vector and its element {}", i);
}

ベクタにはもっと多くの便利なメソッドが定義されています。それらのメソッドについては APIドキュメント で確認することができます。