Moveは、モジュールのインポートを可能にすることで高いモジュール性とコードの再利用を実現しています。同じパッケージ内のモジュールは互いにインポートが可能で、新しいパッケージは既存のパッケージに依存してそのモジュールを使用することができます。このセクションでは、モジュールのインポートの基本と、それを自分のコードでどのように使用するかについて説明します。

モジュールのインポート

同じパッケージで定義されたモジュールは互いにインポートできます。use キーワードの後には、パッケージアドレス(またはエイリアス)とモジュール名が :: で区切られたモジュールパスが続きます。

// File: sources/module_one.move
module book::module_one {
    /// 同じモジュールで定義された構造体。
    public struct Character has drop {}

    /// 新しい `Character` インスタンスを作成するシンプルな関数。
    public fun new(): Character { Character {} }
}

同じパッケージで定義された別のモジュールは、use キーワードを使用して最初のモジュールをインポートできます。

// File: sources/module_two.move
module book::module_two {
    use book::module_one; // 同じパッケージのmodule_oneをインポート

    /// `module_one` モジュールの `new` 関数を呼び出す。
    public fun create_and_ignore() {
        let _ = module_one::new();
    }

メンバーのインポート

モジュールから特定のメンバーもインポートできます。これは、モジュールから単一の関数や型だけが必要な場合に便利です。構文はモジュールをインポートするのと同じですが、モジュールパスの後にメンバー名を追加します。

module book::more_imports {
    use book::module_one::new;       // `module_one` モジュールから `new` 関数をインポート
    use book::module_one::Character; // `module_one` モジュールから `Character` 構造体をインポート

    /// `module_one` モジュールから `new` 関数を呼び出す。
    public fun create_character(): Character {
        new()
    }
}

インポートのグルーピング

複数のメンバーを同じ use ステートメントでグループ化することができます。これは、同じモジュールから複数のメンバーをインポートする必要がある場合に便利です。Moveでは、同じモジュールや同じパッケージからのインポートをグループ化することができます。

module book::grouped_imports {
    // `module_one` モジュールから `new` 関数と `Character` 構造体をインポート
    use book::module_one::{new, Character};

    /// `module_one` モジュールから `new` 関数を呼び出す。
    public fun create_character(): Character {
        new()
    }
}

Moveでは、単一関数のインポートは一般的ではありません。関数名が重複して混乱を招く可能性があるためです。おすすめの方法は、モジュール全体をインポートし、モジュールパスを使用して関数にアクセスすることです。型は一意の名前を持つため、個別にインポートする必要があります。

メンバーとモジュール自体をグループインポートに含める場合、Self キーワードを使用できます。Self キーワードはモジュール自体を参照し、モジュールとそのメンバーをインポートするために使用できます。

module book::self_imports {
    // `Character` 構造体と `module_one` モジュールをインポート
    use book::module_one::{Self, Character};

    /// `module_one` モジュールから `new` 関数を呼び出す。
    public fun create_character(): Character {
        module_one::new()
    }
}

名前の衝突の解決

異なるモジュールから複数のメンバーをインポートする際、名前の衝突が発生する可能性があります。たとえば、同じ名前の関数を持つ2つのモジュールをインポートした場合、関数にアクセスするにはモジュールパスを使用する必要があります。異なるパッケージに同じ名前のモジュールが存在することもあります。衝突を解決し曖昧さを避けるために、Moveはインポートしたメンバーの名前を変更するために as キーワードを提供します。

module book::conflict_resolution {
    // `as` はグループインポートを含む任意のインポートの後に配置できる
    use book::module_one::{Self as mod, Character as Char};

    /// `module_one` モジュールから `new` 関数を呼び出す。
    public fun create(): Char {
        mod::new()
    }
}

外部依存関係の追加

suiバイナリを通じて生成される新しいパッケージには、Sui Frameworkパッケージに対する単一の依存関係を含むMove.tomlファイルが特徴です。Sui Frameworkは標準ライブラリパッケージに依存しています。これらのパッケージはデフォルトの設定で利用可能です。パッケージ依存関係はパッケージマニフェストで次のように定義されます: