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
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) -> TwhereF: 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