rust / intermediate
Snippet
Verstehen der Fn, FnMut und FnOnce Traits
Rust Closures implementieren ein von drei Traits basierend darauf, wie sie erfasste Variablen verwenden. FnOnce konsumiert Erfassungen, FnMut mutiert sie, und Fn leiht unveränderlich. Funktionen können Closures mit Trait-Bounds akzeptieren, was flexible funktionale Muster ermöglicht.
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
26
27
fn apply<F>(func: F, value: i32) -> i32whereF: Fn(i32) -> i32,{func(value)}fn apply_twice<F>(mut func: F, value: i32) -> i32whereF: FnMut(i32) -> i32,{func(func(value))}fn main() {let x = 10;let print_and_return = || {println!("Captured: {}", x);x};println!("Result: {}", apply(print_and_return, 5));let mut counter = 0;let mut increment = || { counter += 1; counter };println!("Counter: {}", apply_twice(increment, 0)); // 2}
Erklärung
1
F: Fn(i32) -> i32
Fn Trait - Closure leiht Erfassungen unveränderlich, kann mehrfach aufgerufen werden
2
F: FnMut(i32) -> i32
FnMut Trait - Closure mutiert Erfassungen, kann mehrfach aufgerufen werden
3
|| { println!("{}", x); x }
Erfasst x per Referenz - implementiert Fn, nicht FnOnce
4
|| { counter += 1; counter }
Mutiert counter - implementiert FnMut