すべてのモジュールメンバーには可視性があります。デフォルトでは、すべてのモジュールメンバーはプライベート(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();
    }
}

パブリック可視性

構造体や関数は、funstructキーワードの前に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 へ戻る