8.5 Function Scope and Nested Functions
Rust supports defining functions both at the top level of a module (similar to C) and nested within other functions.
8.5.1 Scope of Top-Level Functions
Functions defined directly within a module (not inside another function or block) are called top-level functions. They are visible throughout the entire module in which they are defined, regardless of the order of definition.
To make a top-level function accessible from other modules, you must mark it with the pub
keyword (for public).
mod utils { // This function is private to the 'utils' module by default. fn helper() { println!("Private helper function."); } // This function is public and can be called from outside 'utils'. pub fn perform_task() { println!("Performing public task..."); helper(); // Can call private functions within the same module. } } fn main() { utils::perform_task(); // OK: perform_task is public. // utils::helper(); // Error: helper is private. }
8.5.2 Nested Functions
Rust allows defining functions inside the body of other functions. These are called nested functions or inner functions. A nested function is only visible and callable within the scope of the outer function where it is defined.
fn outer_function(x: i32) { println!("Entering outer function with x = {}", x); // Define a nested function. fn inner_function(y: i32) { println!(" Inner function called with y = {}", y); // Cannot access 'x' from outer_function here. // println!(" Cannot access x: {}", x); // Compile Error! } // Call the nested function. inner_function(x * 2); println!("Exiting outer function."); } fn main() { outer_function(5); // inner_function(10); // Error: inner_function is not in scope here. }
Key difference from Closures: Nested functions in Rust cannot capture variables from their enclosing environment (like x
in the example above). If you need a function-like construct that can access variables from its surrounding scope, you should use a closure (Chapter 12). Nested functions are simpler entities, essentially just namespaced helper functions local to another function’s implementation.