主要なストレージ操作を定義するモジュールはsui::transfer
である。これはSuiフレームワークに依存するすべてのパッケージにおいて暗黙的にインポートされるため、他の暗黙的にインポートされるモジュール(例:std::option
やstd::vector
)と同様に、use文を追加する必要はない。
トランスファー(transfer
)モジュールは、前述した所有権タイプに対応する全3つのストレージ操作を実行するための関数を提供する:
<aside>
⚠️ このページでは、いわゆる制限付きストレージ操作についてのみ説明する。後ほど、ストア(store
)アビリティが導入された後に、パブリックなストレージ操作についても説明する。
</aside>
トランスファー(transfer
)モジュールは、ほとんどのストレージ操作に対応している。ただし、次の章ではダイナミックフィールドを使った特別なケースが待ち構えている。
所有権、スコープ、参照の章では、Moveにおける所有権と参照の基本を説明した。ストレージ関数を使用する際には、これらの概念を理解していることが重要である。ここで、最も重要なポイントの簡単な要約を示す:
&T
または可変参照&mut T
がある。すると、値を借用して呼び出し元のスコープでアクセスできるようになるが、オーナーは同じままである。/// Moved by value
public fun take<T>(value: T) { /* value is moved here! */ abort 0 }
/// For immutable reference
public fun borrow<T>(value: &T) { /* value is borrowed here! can be read */ abort 0 }
/// For mutable reference
public fun borrow_mut<T>(value: &mut T) { /* value is mutably borrowed here! */ abort 0 }
transfer::transfer
関数は、オブジェクトを別のアドレスに転送するための公開関数である。そのシグネチャは以下の通りで、キー(key
)アビリティを持つタイプと受取人のアドレスのみを受け入れる。注意してもらいたいが、オブジェクトは値として関数に渡されるため、関数のスコープに移動され、その後受取人のアドレスに移動される: