コレクション型は、あらゆるプログラミング言語の基本的な部分です。アイテムのリストなど、データのコレクションを格納するために使用されます。vector
型については、vectorセクションですでに説明しました 。この章では、Suiフレームワークが提供するvecrorベースのコレクション型について説明します。
以前、vectorセクションで、このvector
型について説明しましたが、新しいコンテキストでもう一度説明しておく価値があります。今回は、オブジェクトでのこの型の使用法と、アプリケーションでの使用方法について説明します。
module book::collections_vector {
use std::string::String;
/// 本屋で販売できる本
public struct Book has key, store {
id: UID,
name: String
}
/// 本を売る本屋
public struct BookStore has key, store {
id: UID,
books: vector<Book>
}
}
VecSet
は、一意のアイテムのセットを格納するコレクション型 に似ています。vector
が、重複するアイテムは許可されません。そのため、一意の ID やアドレスのリストなど、一意のアイテムのコレクションを格納する場合には便利です。
module book::collections_vec_set {
use sui::vec_set::{Self, VecSet};
public struct App has drop {
/// 構造体定義で使用される `VecSet`
subscribers: VecSet<address>
}
#[test]
fun vec_set_playground() {
let set = vec_set::empty<u8>(); // 空のセットを作成
let mut set = vec_set::singleton(1); // 単一のアイテムを持つセットを作成
set.insert(2); // セットにアイテムを追加
set.insert(3);
assert!(set.contains(&1), 0); // セットにアイテムが含まれているか確認
assert!(set.size() == 3, 1); // セットのアイテム数を取得
assert!(!set.is_empty(), 2); // セットが空でないか確認
set.remove(&2); // セットからアイテムを削除
}
}
VecSet は、セット内に既に存在するアイテムを挿入しようとすると失敗します。
VecMap
はキーと値のペアを格納するコレクション型です。VecSet
に似ていますが、セット内の各アイテムに値を関連付けることができます。これにより、アドレスとその残高のリストやユーザーIDと関連データのリストなど、キーと値のペアのコレクションを格納するのに便利です。
VecMap
のキーは一意であり、各キーには単一の値しか関連付けることができません。既に存在するキーでキーと値のペアを挿入しようとすると、古い値は新しい値に置き換えられます。
module book::collections_vec_set {
use sui::vec_set::{Self, VecSet};
public struct App has drop {
/// 構造体定義で使用される `VecSet`
subscribers: VecSet<address>
}
#[test]
fun vec_set_playground() {
let set = vec_set::empty<u8>(); // 空のセットを作成
let mut set = vec_set::singleton(1); // 単一のアイテムを持つセットを作成
set.insert(2); // セットにアイテムを追加
set.insert(3);
assert!(set.contains(&1), 0); // セットにアイテムが含まれているか確認
assert!(set.size() == 3, 1); // セットのアイテム数を取得
assert!(!set.is_empty(), 2); // セットが空でないか確認
set.remove(&2); // セットからアイテムを削除
}
}
標準のコレクションタイプは、型付きデータを安全かつ一貫性を持って格納するための優れた方法です。しかし、格納できるデータの種類に制限があります。型システムはコレクションに誤った型を格納することを許しません。また、サイズにも制限があります。オブジェクトのサイズ制限により、比較的小さなセットやリストには適していますが、より大きなコレクションには別のアプローチが必要になるかもしれません。
コレクション型のもう一つの制限は、比較ができないことです。挿入順序が保証されていないため、VecSet
を別のVecSet
と比較しようとすると、期待通りの結果が得られないことがあります。
この動作はリンターによって検出され、次の警告が表示されます: 'sui::vec_set::VecSet' 型のコレクションを比較すると予期しない結果が得られる可能性があります。
let mut set1 = vec_set::empty();
set1.insert(1);
set1.insert(2);let mut set2 = vec_set::empty();
set2.insert(2);
set2.insert(1);assert!(set1 == set2, 0);
上記の例では、挿入順序が保証されていないため、比較は失敗します。2つのVecSet
インスタンスが異なる順序で要素を持っている可能性があるからです。たとえ2つのVecSet
インスタンスが同じ要素を含んでいても、比較は失敗します。