Important Rust Topics
Rust Closures
Functions without a name that remember the variables around them.
What you'll learn
- |n| n * 2
- Capturing variables
- move and returning closures
Closure → result
|n| n * 2apply(21) → 42|n| n + bonusapply(5) → 15make_adder(5)add_five(1) → 6A function that captures its surroundings
A closure is a function without a name that you can store in a variable or pass to another function. Unlike a normal function, it can use variables from the place where it was created.
|n| n * 2 is a closure with one parameter. add_bonus reads bonus from the surrounding code. move makes the closure own what it captures, which is needed when the closure is returned from make_adder. increment changes counter, so it must be declared mut.
Key points
- A closure can use variables from where it was created.
- move makes it own what it captures.
- A closure that changes a variable must be mut.
Runnable Rust example
Rust
main.rs
fn apply(value: i32, operation: impl Fn(i32) -> i32) -> i32 {
operation(value)
}
fn make_adder(amount: i32) -> impl Fn(i32) -> i32 {
move |value| value + amount
}
fn main() {
let double = |n| n * 2;
println!("{}", apply(21, double));
let bonus = 10;
let add_bonus = |n| n + bonus; // captures bonus from the environment
println!("{}", apply(5, add_bonus));
let add_five = make_adder(5);
println!("{}", add_five(1));
let mut counter = 0;
let mut increment = || counter += 1;
increment();
increment();
println!("counter = {counter}");
}
42
15
6
counter = 2Practice
Open the example in the online compiler, change a value or add a line, and predict the output before you run it. Then break the code on purpose and read the compiler's message.
Finished this lesson?
Mark it as learned to track your progress.
Your progress is saved in this browser Sign in to keep it on every device.
Practice with a challenge
Use what this lesson covers to solve a real problem. Each challenge runs in your browser with instant tests and an AI review.
All challenges