Rust
Closures
Closures and Fn traits.
By EZ4Code Team
closureclosure
Code
fn main() {
let name = "Alice".to_string();
// Closure captures environment
let greet = || println!("Hello, {}!", name);
greet();
// FnOnce (consumes capture)
let name2 = "Bob".to_string();
let consume = move || println!("Goodbye, {}", name2); // move transfers ownership
consume();
// Closure as parameter
let nums = vec![1, 2, 3];
let doubled: Vec<i32> = nums.iter().map(|x| x * 2).collect();
// Return closure
fn make_adder(x: i32) -> impl Fn(i32) -> i32 {
move |y| x + y
}
let add5 = make_adder(5);
println!("5 + 3 = {}", add5(3));
// Closure storage
let funcs: Vec<Box<dyn Fn(i32) -> i32>> = vec![
Box::new(|x| x + 1),
Box::new(|x| x * 2),
Box::new(|x| x - 3),
];
for f in &funcs {
println!("{}", f(10));
}
}Explanation
Closures capture environment variables; the move keyword forces ownership transfer; closures implement Fn/FnMut/FnOnce traits.