capypad
0 Tage Serie
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
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
26
27
fn apply<F>(func: F, value: i32) -> i32
where
F: Fn(i32) -> i32,
{
func(value)
}
 
fn apply_twice<F>(mut func: F, value: i32) -> i32
where
F: 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
Verstehen der Fn, FnMut und FnOnce Traits — Capypad