すべてのモジュールメンバーには可視性があります。デフォルトでは、すべてのモジュールメンバーはプライベート(private)です。つまり、定義されたモジュール内でのみアクセス可能です。ただし、可視性修飾子を追加することで、モジュールメンバーをパブリック(public)にすることができます。パブリックにすると、モジュール外からも見えるようになります。また、public(package)にすると、同じパッケージ内のモジュールから見えるようになります。さらに、entry修飾子を付けると、トランザクションから呼び出すことができますが、他のモジュールからは呼び出せなくなります。
可視性修飾子のないモジュール内で定義された関数や構造体は、そのモジュールに対してプライベートです。他のモジュールから呼び出すことはできません。
module book::internal_visibility {
// この関数は同じモジュール内の他の関数から呼び出すことができます
fun internal() { /* ... */ }
// 同じモジュール -> internal()を呼び出せます
fun call_internal() {
internal();
}
}
module book::try_calling_internal {
use book::internal_visibility;
// 異なるモジュール -> internal()を呼び出せません
fun try_calling_internal() {
internal_visibility::internal();
}
}
構造体や関数は、fun
やstruct
キーワードの前にpublic
キーワードを追加することでパブリックにすることができます。
module book::public_visibility {
// この関数は他のモジュールから呼び出すことができます
public fun public() { /* ... */ }
}
パブリック関数は他のモジュールからインポートして呼び出すことができます。以下のコードはコンパイルされます:
module book::try_calling_public {
use book::public_visibility;
// 異なるモジュール -> public()を呼び出せます
fun try_calling_public() {
public_visibility::public();
}
}
Move 2024ではパッケージ可視性修飾子が導入されました。パッケージ可視性を持つ関数は、同じパッケージ内の任意のモジュールから呼び出すことができます。他のパッケージからは呼び出せません。
module book::package_visibility {
public(package) fun package_only() { /* ... */ }
}
パッケージ関数は同じパッケージ内の任意のモジュールから呼び出すことができます:
module book::try_calling_package {
use book::package_visibility;
// 同じ`book`パッケージ -> package_only()を呼び出せます
fun try_calling_package() {
package_visibility::package_only();
}
}
The Move Book へ戻る