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
1
2
3
4
5
6
7
8
9
10
11
12
fn apply_twice<F>(f: F, value: i32) -> i32whereF: 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)