可視性
デフォルトでは、モジュール内のアイテムは非公開の可視性を持ちますが、これは 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 ^ この行のコメントを外してみてください }