ベクターは、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
モジュールをインポートする必要があります。
標準ライブラリには、ベクターを操作するためのメソッドが用意されています。最もよく使用される操作の一部を次に示します。
push_back
: ベクターの末尾に要素を追加します。
pop_back
: ベクターから最後の要素を削除します。
length
: ベクター内の要素数を返します。
is_empty
: ベクターが空の場合、true を返します。
remove
: 指定されたインデックスの要素を削除します。
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]を参照