capypad
0 Tage Serie
rust / intermediate
Snippet

Closures: Umgebung einfangen und Funktionstraits

Rust-Closures fangen Variablen aus ihrer Umgebung ein. FnMut erlaubt Mutation eingefangener Variablen, Fn konsumiert sie, und FnOnce nimmt Ownership. Generische Bounds ermöglichen es, Funktionen zu schreiben, die verschiedene Closure-Typen akzeptieren.

snippet.rs
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
fn apply_with_log<F, T>(mut f: F, value: T) -> T
where
F: FnMut(T) -> T,
{
println!("Before: {:?}", value);
let result = f(value);
println!("After: {:?}", result);
result
}
 
fn main() {
let multiplier = 3i32;
let increment = 10i32;
let mut combined = |x: i32| -> i32 {
x * multiplier + increment
};
let result = apply_with_log(combined, 5);
println!("Final result: {}", result);
let numbers = vec![1, 2, 3, 4, 5];
let sum: i32 = numbers.iter().map(|x| x * multiplier).sum();
println!("Sum: {}", sum);
}
Erklärung
1
FnMut(T) -> T
FnMut kann eingefangene Umgebung mutieren, gibt transformierten Wert zurück
2
let multiplier = 3i32;
Variable wird von Closure eingefangen, lebt in Closures Umgebung
3
let mut combined = |x: i32| -> i32 { ... }
Closure fängt sowohl multiplier als auch increment vom Scope ein
4
numbers.iter().map(|x| x * multiplier)
Closure wird an Iterator übergeben, eingefangener multiplier inline verwendet