Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

可視性

デフォルトでは、モジュール内のアイテムは非公開の可視性を持ちますが、これは pub 修飾子で上書きできます。モジュールの公開アイテムのみが、 モジュールスコープの外側からアクセスできます。

// `my_mod` という名前のモジュール
mod my_mod {
    // モジュール内のアイテムはデフォルトで非公開の可視性になります。
    fn private_function() {
        println!("called `my_mod::private_function()`");
    }

    // デフォルトの可視性を上書きするには `pub` 修飾子を使用します。
    pub fn function() {
        println!("called `my_mod::function()`");
    }

    // アイテムは同じモジュール内の他のアイテムにアクセスできます。
    // たとえ非公開であってもです。
    pub fn indirect_access() {
        print!("called `my_mod::indirect_access()`, that\n> ");
        private_function();
    }

    // モジュールはネストすることもできます
    pub mod nested {
        pub fn function() {
            println!("called `my_mod::nested::function()`");
        }

        #[allow(dead_code)]
        fn private_function() {
            println!("called `my_mod::nested::private_function()`");
        }

        // `pub(in path)` 構文を使って宣言された関数は、
        // 指定されたパス内でのみ可視です。`path` は親または祖先モジュールでなければなりません
        pub(in crate::my_mod) fn public_function_in_my_mod() {
            print!("called `my_mod::nested::public_function_in_my_mod()`, that\n> ");
            public_function_in_nested();
        }

        // `pub(self)` 構文を使って宣言された関数は、現在の
        // モジュール内でのみ可視であり、非公開のままにするのと同じです
        pub(self) fn public_function_in_nested() {
            println!("called `my_mod::nested::public_function_in_nested()`");
        }

        // `pub(super)` 構文を使って宣言された関数は、
        // 親モジュール内でのみ可視です
        pub(super) fn public_function_in_super_mod() {
            println!("called `my_mod::nested::public_function_in_super_mod()`");
        }
    }

    pub fn call_public_function_in_my_mod() {
        print!("called `my_mod::call_public_function_in_my_mod()`, that\n> ");
        nested::public_function_in_my_mod();
        print!("> ");
        nested::public_function_in_super_mod();
    }

    // pub(crate) は、関数を現在のクレート内でのみ可視にします
    pub(crate) fn public_function_in_crate() {
        println!("called `my_mod::public_function_in_crate()`");
    }

    // ネストされたモジュールも可視性について同じルールに従います
    mod private_nested {
        #[allow(dead_code)]
        pub fn function() {
            println!("called `my_mod::private_nested::function()`");
        }

        // 非公開の親アイテムは、子アイテムの可視性を引き続き制限します。
        // たとえそれがより大きなスコープ内で可視として宣言されていてもです。
        #[allow(dead_code)]
        pub(crate) fn restricted_function() {
            println!("called `my_mod::private_nested::restricted_function()`");
        }
    }
}

fn function() {
    println!("called `function()`");
}

fn main() {
    // モジュールにより、同じ名前を持つアイテム同士を区別できます。
    function();
    my_mod::function();

    // ネストされたモジュール内のものを含む公開アイテムは、
    // 親モジュールの外側からアクセスできます。
    my_mod::indirect_access();
    my_mod::nested::function();
    my_mod::call_public_function_in_my_mod();

    // pub(crate) アイテムは同じクレート内のどこからでも呼び出せます
    my_mod::public_function_in_crate();

    // pub(in path) アイテムは、指定されたモジュール内からのみ呼び出せます
    // エラー!関数 `public_function_in_my_mod` は非公開です
    //my_mod::nested::public_function_in_my_mod();
    // TODO ^ この行のコメントを外してみてください

    // モジュールの非公開アイテムは直接アクセスできません。たとえ
    // 公開モジュール内にネストされていてもです。

    // エラー!`private_function` は非公開です
    //my_mod::private_function();
    // TODO ^ この行のコメントを外してみてください

    // エラー!`private_function` は非公開です
    //my_mod::nested::private_function();
    // TODO ^ この行のコメントを外してみてください

    // エラー!`private_nested` は非公開モジュールです
    //my_mod::private_nested::function();
    // TODO ^ この行のコメントを外してみてください

    // エラー!`private_nested` は非公開モジュールです
    //my_mod::private_nested::restricted_function();
    // TODO ^ この行のコメントを外してみてください
}