rust / intermediate
Snippet
impl Trait für Vereinfachung von Rückgabetypen
impl Trait in Rückgabe-Position bietet Typ-Löschung für Funktionen und vereinfacht generische Signaturen. Der Compiler leitet den konkreten Typ an der Aufrufstelle ab. In Kombination mit Funktionsparametern, die impl Trait akzeptieren, ermöglicht dies saubere Abstraktion ohne explizite generische Syntax.
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
fn largest<T: PartialOrd>(slice: &[T]) -> &T {let mut largest = &slice[0];for item in slice.iter() {if item > largest {largest = item;}}largest}fn create_filter(predicate: impl Fn(i32) -> bool) -> impl Fn(i32) -> bool {move |x| predicate(x) && x > 0}fn main() {let numbers = vec![1, 5, 3, 8, 2];let result = largest(&numbers);println!("Largest: {}", result);let is_even = |x| x % 2 == 0;let filter = create_filter(is_even);println!("10 even and positive: {}", filter(10)); // true}
Erklärung
1
impl Fn(i32) -> bool
Akzeptiert jede Closure oder Funktion, die dieser Signatur entspricht - konkreter Typ vor Aufrufern verborgen
2
-> impl Fn(i32) -> bool
Rückgabetyp verwendet impl Trait - Aufrufer kann den Typ nicht benennen, aber nutzen
3
move |x| predicate(x) && x > 0
Gibt Closure zurück, die predicate erfasst - Typ ist compiler-generiert und opak
4
largest<T: PartialOrd>(&[T]) -> &T
Klassische generische Funktion mit Trait-Bound für Vergleich