Sui フレームワークは、ダイナミックフィールドとダイナミックオブジェクトフィールドの概念に基づいて構築された様々なコレクションタイプを提供しています。これらのコレクションは、ダイナミックフィールドとオブジェクトをより安全で理解しやすい方法で保存および管理するように設計されています。
各コレクションタイプについて、使用するプリミティブと提供する特定の機能を指定します。
ダイナミック(オブジェクト)フィールドがUIDで操作するのとは異なり、コレクションタイプは独自の型を持ち、関連する関数の呼び出しを可能にします。
すべてのコレクションタイプは、同じメソッドセットを共有しています:
add
- コレクションにフィールドを追加します。remove
- コレクションからフィールドを削除します。borrow
- コレクションからフィールドを借用します。borrow_mut
- コレクションからフィールドへの可変参照を借用します。contains
- フィールドがコレクションに存在するかチェックします。length
- コレクション内のフィールド数を返します。is_empty
- lengthが0かどうかをチェックします。すべてのコレクションタイプは、borrow
とborrow_mut
メソッドのインデックス構文をサポートしています。例で角括弧を見かけた場合、それらはborrow
とborrow_mut
の呼び出しに変換されます。
let hat: &Hat = &bag[b"key"];
let hat_mut: &mut Hat = &mut bag[b"key"];
// これは以下と同等です。
let hat: &Hat = bag.borrow(b"key");
let hat_mut: &mut Hat = bag.borrow_mut(b"key");
例では、これらの関数に焦点を当てるのではなく、コレクションタイプ間の違いに注目します。
名前が示すように、Bagは異種の値の「バッグ」として機能します。これは、任意のデータを保存できるシンプルな非ジェネリックタイプです。Bagはフィールド数を追跡し、空でない場合は破棄できないため、孤立したフィールドを許可しません。
// ファイル: [sui-framework/sources/bag.move](<https://github.com/MystenLabs/sui/blob/main/crates/sui-framework/packages/sui-framework/sources/bag.move>)
public struct Bag has key, store {
/// このバッグのID
id: UID,
/// バッグ内のキーと値のペアの数
size: u64,
}
Bagは任意の型を保存するため、提供する追加のメソッドは以下の通りです:
contains_with_type
- 特定の型のフィールドが存在するかチェックします構造体のフィールドとして使用する例:
/// `sui::bag`モジュールからインポート。
use sui::bag::{Self, Bag};
/// `Bag`を構造体のフィールドとして使用する例。
public struct Carrier has key {
id: UID,
bag: Bag
}
Bagの使用例:
let mut bag = bag::new(ctx);
// bagには要素数を取得する`length`関数があります。
assert!(bag.length() == 0, 0);
bag.add(b"my_key", b"my_value".to_string());
// lengthが1に変更されました。
assert!(bag.length() == 1, 1);
// 順に:`borrow`、`borrow_mut`、`remove`
// 値の型を指定する必要があります。
let field_ref: &String = &bag[b"my_key"];
let field_mut: &mut String = &mut bag[b"my_key"];
let field: String = bag.remove(b"my_key");
// lengthが0に戻ったので、アンパックできます。
bag.destroy_empty();
sui::object_bag
モジュールで定義されています。Bagと同じですが、内部的にダイナミックオブジェクトフィールドを使用します。値としてオブジェクトのみを保存できます。
Tableは、キーと値に固定の型を持つ型付きダイナミックコレクションです。sui::table
モジュールで定義されています。