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は標準ライブラリパッケージに依存しています。これらのパッケージはデフォルトの設定で利用可能です。パッケージ依存関係はパッケージマニフェストで次のように定義されます: