ドロップ(drop) 機能 - 最も単純なもの - は、構造体のインスタンスを無視または破棄することを可能にします。多くのプログラミング言語では、この挙動はデフォルトと見なされます。しかし、Moveにおいては、ドロップ能力のない構造体は無視することが許されていません。これはMove言語の安全性機能であり、すべての資産が適切に扱われることを保証します。ドロップ能力のない構造体を無視しようとすると、コンパイルエラーが発生します。

module book::drop_ability {

    /// この構造体は `drop` 能力を持っています。
    public struct IgnoreMe has drop {
        a: u8,
        b: u8,
    }

    /// この構造体は `drop` 能力を持っていません。
    public struct NoDrop {}

    #[test]
    // `IgnoreMe` 構造体のインスタンスを作成して無視します。
    // インスタンスを構築したにもかかわらず、アンパックする必要はありません。
    fun test_ignore() {
        let no_drop = NoDrop {};
        let _ = IgnoreMe { a: 1, b: 2 }; // アンパックする必要はない

        // コードをコンパイルするには値をアンパックする必要があります。
        let NoDrop {} = no_drop; // OK
    }
}

ドロップ能力は、カスタムコレクションタイプにしばしば使用され、コレクションが不要になった際の特別な処理を不要にします。例えば、ベクタータイプはドロップ能力を持ち、それが不要になった際にベクターを無視することができます。しかし、Moveの型システムの最大の特徴はドロップを持たないことです。これにより、資産が適切に扱われ、無視されないことが保証されます。

単一のドロップ能力を持つ構造体は「Witness」と呼ばれます。この概念については、Witnessと抽象実装 [TODO] セクションで説明します。

ドロップ能力を持つタイプ

Moveのすべてのネイティブタイプはドロップ能力を持ちます。これには以下が含まれます:

標準ライブラリで定義されたタイプもすべてドロップ能力を持っています。これには以下が含まれます:

参考文献

The Move Book へ戻る