Sui フレームワークは、ダイナミックフィールドダイナミックオブジェクトフィールドの概念に基づいて構築された様々なコレクションタイプを提供しています。これらのコレクションは、ダイナミックフィールドとオブジェクトをより安全で理解しやすい方法で保存および管理するように設計されています。

各コレクションタイプについて、使用するプリミティブと提供する特定の機能を指定します。

ダイナミック(オブジェクト)フィールドがUIDで操作するのとは異なり、コレクションタイプは独自の型を持ち、関連する関数の呼び出しを可能にします。

共通の概念

すべてのコレクションタイプは、同じメソッドセットを共有しています:

すべてのコレクションタイプは、borrowborrow_mutメソッドのインデックス構文をサポートしています。例で角括弧を見かけた場合、それらはborrowborrow_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は異種の値の「バッグ」として機能します。これは、任意のデータを保存できるシンプルな非ジェネリックタイプです。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は任意の型を保存するため、提供する追加のメソッドは以下の通りです:

構造体のフィールドとして使用する例:

/// `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();

ObjectBag

sui::object_bagモジュールで定義されています。Bagと同じですが、内部的にダイナミックオブジェクトフィールドを使用します。値としてオブジェクトのみを保存できます。

Table

Tableは、キーと値に固定の型を持つ型付きダイナミックコレクションです。sui::tableモジュールで定義されています。