ベクターは、Moveで要素のコレクションを格納するネイティブな方法です。他のプログラミング言語の配列に似ていますが、いくつかの違いがあります。このセクションでは、そのvector 型とその操作について説明します。

ベクター構文

vector型は、キーワードとそれに続く山括弧内の要素の型vectorを使用して定義されます。要素の型は、他のベクターを含む有効な Move型であればどれでもかまいません。Move にはベクターリテラル構文があり、vectorキーワードとそれに続く要素を含む角括弧 (または空のベクターの場合は要素なし) を使用してベクターを作成できます。

// bool要素の空のベクター
let empty: vector<bool> = vector[];

// u8要素のベクター
let v: vector<u8> = vector[10, 20, 30];

// vector<u8>要素のベクター
let vv: vector<vector<u8>> = vector[
    vector[10, 20],
    vector[30, 40]
];

このvector型は Move の組み込み型であり、モジュールからインポートする必要はありません。ただし、ベクター演算はモジュールで定義されているため、使用するにはstd::vectorモジュールをインポートする必要があります。

ベクター演算

標準ライブラリには、ベクターを操作するためのメソッドが用意されています。最もよく使用される操作の一部を次に示します。

let mut v = vector[10u8, 20, 30];

assert!(v.length() == 3, 0);
assert!(!v.is_empty(), 1);

v.push_back(40);
let last_value = v.pop_back();

assert!(last_value == 40, 2);

ドロップ不可能な型のベクターの破棄

ドロップ不可能な型のベクターは破棄できません。ドロップ機能のない型のベクターを定義すると、そのベクターの値を無視することはできません。しかし、ベクターが空の場合、コンパイラは destroy_empty 関数の明示的な呼び出しを要求します。

/// `drop` 機能のない構造体。
public struct NoDrop {}

#[test]
fun test_destroy_empty() {
    // `NoDrop` 要素のベクターを初期化。
    let v = vector<NoDrop>[];

    // `v` が空であることはわかっていますが、それでもベクターを破棄するために
    // 明示的な `destroy_empty` 関数を呼び出す必要があります。
    v.destroy_empty();
}

さらに読む

Move ReferenceのVector [TODO]を参照