Skip to content
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.

More Rust Snippets