capypad
0 Tage Serie
rust / intermediate
Snippet

Closures als Funktionsparameter mit impl Fn

Closures können als Funktionsparameter unter Verwendung von Trait-Grenzen übergeben werden. Das Fn Trait repräsentiert Closures, die ihre Umgebung by Reference einfangen. Durch die Spezifikation von Fn(i32) -> i32 akzeptieren wir jede Closure, die ein i32 nimmt und ein i32 zurückgibt, unabhängig davon, wie sie intern Variablen einfängt.

snippet.rs
rust
1
2
3
4
5
6
7
8
9
10
11
12
fn apply_twice<F>(f: F, value: i32) -> i32
where
F: Fn(i32) -> i32,
{
f(f(value))
}
 
fn main() {
let triple = |x: i32| x * 3;
let result = apply_twice(triple, 5);
println!("Result: {}", result); // 45 (triple applied twice)
}
Erklärung
1
fn apply_twice<F>(f: F, value: i32) -> i32
Generische Funktion, wobei F ein Typparameter ist, der ein aufrufbares Objekt repräsentiert
2
F: Fn(i32) -> i32,
F muss das Fn Trait implementieren - eine Closure, die i32 nimmt und i32 zurückgibt
3
f(f(value))
Wendet die Closure zweimal an: zuerst f(5)=15, dann f(15)=45
4
let triple = |x: i32| x * 3;
Erstellt eine Closure, die mit 3 multipliziert und in triple speichert
5
apply_twice(triple, 5)
Übergibt die Closure an apply_twice - sie wird kopiert (Fn ist Copy)