Visibility
By default, the items in a module have private visibility, but this can be overridden with the pub
modifier. Only the public items of a module can be accessed from outside the module scope.
// A module named `my_mod`mod my_mod {// Items in modules default to private visibility.fn private_function() {println!("called `my_mod::private_function()`");}// Use the `pub` modifier to override default visibility.pub fn function() {println!("called `my_mod::function()`");}// Items can access other items in the same module,// even when private.pub fn indirect_access() {print!("called `my_mod::indirect_access()`, that\n> ");private_function();}// Modules can also be nestedpub mod nested {pub fn function() {println!("called `my_mod::nested::function()`");}#[allow(dead_code)]fn private_function() {println!("called `my_mod::nested::private_function()`");}// Functions declared using `pub(in path)` syntax are only visible// within the given path. `path` must be a parent or ancestor modulepub(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();}// Functions declared using `pub(self)` syntax are only visible within// the current module, which is the same as leaving them privatepub(self) fn public_function_in_nested() {println!("called `my_mod::nested::public_function_in_nested()`");}// Functions declared using `pub(super)` syntax are only visible within// the parent modulepub(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) makes functions visible only within the current cratepub(crate) fn public_function_in_crate() {println!("called `my_mod::public_function_in_crate()`");}// Nested modules follow the same rules for visibilitymod private_nested {#[allow(dead_code)]pub fn function() {println!("called `my_mod::private_nested::function()`");}// Private parent items will still restrict the visibility of a child item,// even if it is declared as visible within a bigger scope.#[allow(dead_code)]pub(crate) fn restricted_function() {println!("called `my_mod::private_nested::restricted_function()`");}}}fn function() {println!("called `function()`");}fn main() {// Modules allow disambiguation between items that have the same name.function();my_mod::function();// Public items, including those inside nested modules, can be// accessed from outside the parent module.my_mod::indirect_access();my_mod::nested::function();my_mod::call_public_function_in_my_mod();// pub(crate) items can be called from anywhere in the same cratemy_mod::public_function_in_crate();// pub(in path) items can only be called from within the module specified// Error! function `public_function_in_my_mod` is private//my_mod::nested::public_function_in_my_mod();// TODO ^ Try uncommenting this line// Private items of a module cannot be directly accessed, even if// nested in a public module:// Error! `private_function` is private//my_mod::private_function();// TODO ^ Try uncommenting this line// Error! `private_function` is private//my_mod::nested::private_function();// TODO ^ Try uncommenting this line// Error! `private_nested` is a private module//my_mod::private_nested::function();// TODO ^ Try uncommenting this line// Error! `private_nested` is a private module//my_mod::private_nested::restricted_function();// TODO ^ Try uncommenting this line}