Module visibility controls which parts of your code can be seen and used by other parts. It helps keep your code organized and safe.
Module visibility in Rust
mod my_module {
pub fn public_function() {
// code
}
fn private_function() {
// code
}
}pub means the item is public and can be used outside the module.
Without pub, items are private and only usable inside the module.
cook is public and can be called from outside kitchen. clean is private and only usable inside kitchen.mod kitchen {
pub fn cook() {
println!("Cooking food");
}
fn clean() {
println!("Cleaning kitchen");
}
}tools and its function hammer are public, so they can be accessed from outside garage. The function open_door is private.mod garage {
pub mod tools {
pub fn hammer() {
println!("Using hammer");
}
}
fn open_door() {
println!("Opening garage door");
}
}This program shows a module house with a public submodule living_room. The function watch_tv is public and can be called from main. The other functions are private and cannot be called from outside their modules.
mod house {
pub mod living_room {
pub fn watch_tv() {
println!("Watching TV in the living room");
}
fn clean_room() {
println!("Cleaning the living room");
}
}
fn lock_doors() {
println!("Locking all doors");
}
}
fn main() {
house::living_room::watch_tv();
// house::living_room::clean_room(); // This will cause an error because clean_room is private
// house::lock_doors(); // This will cause an error because lock_doors is private
}Use pub(crate) to make items visible only inside the current crate (project).
Modules can be nested, and visibility rules apply at each level.
Private items help keep your code safe by hiding details that should not be changed directly.
Module visibility controls what parts of code can be used outside their module.
pub makes items public; without it, items are private.
Use visibility to organize code and protect important parts.
Practice
pub keyword do in Rust module visibility?Solution
Step 1: Understand the role of
Thepubpubkeyword in Rust is used to make functions, structs, or other items accessible from outside the module they are defined in.Step 2: Contrast with default visibility
By default, items are private and cannot be accessed outside their module unless marked withpub.Final Answer:
Makes a function or item accessible outside its module -> Option AQuick Check:
pub= public access [OK]
- Thinking pub hides the item
- Confusing pub with renaming
- Assuming pub deletes the item
Solution
Step 1: Recall correct syntax for public structs
In Rust, to make a struct public, thepubkeyword must come before thestructkeyword.Step 2: Check placements of pub
pub struct MyStruct { field: i32 }correctly placespubbeforestruct. Placingpubinside the braces (on field), writingstruct pub MyStruct, orstruct MyStruct pub {}are incorrect.Final Answer:
pub struct MyStruct { field: i32 } -> Option CQuick Check:
pub structis correct syntax [OK]
- Placing pub inside struct braces
- Putting pub after struct name
- Writing pub in the wrong order
pub mod outer {
pub mod inner {
pub fn greet() { println!("Hello!"); }
}
}
fn main() {
outer::inner::greet();
}What will be the output when this code runs?
Solution
Step 1: Check visibility of modules and function
Theoutermodule is public, containingpub mod innerwithpub fn greet(), making them all accessible frommain.Step 2: Confirm function call and output
The callouter::inner::greet()is valid and will print "Hello!" to the console.Final Answer:
Hello! -> Option DQuick Check:
pub modules and functions allow access [OK]
- Overlooking that the outer module needs pub
- Thinking greet is private by default
- Ignoring nested module visibility
mod my_mod {
fn secret() {
println!("Secret function");
}
}
fn main() {
my_mod::secret();
}Solution
Step 1: Check function visibility
The functionsecretis not markedpub, so it is private tomy_mod.Step 2: Understand call from main
Sincemainis outsidemy_mod, it cannot call a private function, causing a compile error.Final Answer:
secret function is private and cannot be called from main -> Option AQuick Check:
Private functions can't be accessed outside module [OK]
- Thinking module must be pub to call function
- Assuming missing semicolon causes error
- Believing pub inside main is needed
Config inside a module, but want to allow other modules to create instances with limited access to its fields. Which visibility setup is correct?Solution
Step 1: Understand struct and field visibility
Making the structpuballows other modules to create instances, but keeping fields private restricts direct access to internal data.Step 2: Evaluate other approaches
Keeping the struct private (with or without pub fields) prevents other modules from constructing instances. Making everything private blocks access entirely.Final Answer:
Make structpubbut keep fields private -> Option BQuick Check:
pub struct + private fields = controlled access [OK]
- Making fields pub but struct private (no instance creation)
- Making everything private (no access)
- Exposing fields unintentionally
Ready to prove it?
Pass the test and this pattern moves unknown
