π Dateien dieser Lerneinheit:
β‘ 1. Closures & die Trait-Hierarchie (Fn, FnMut, FnOnce)
Ein Closure ist eine anonyme Funktion, die Variablen aus ihrer Umgebung einfangen (capturen) kann. Der Rust-Compiler leitet automatisch das restriktivste Trait ab:
ββββββββββββββββ
β FnOnce β (Konsumiert Umgebung / Move, 1x aufrufbar)
ββββββββ¬ββββββββ
β²
ββββββββ΄ββββββββ
β FnMut β (VerΓ€ndert Umgebung &mut, mehrfach aufrufbar)
ββββββββ¬ββββββββ
β²
ββββββββ΄ββββββββ
β Fn β (Liest Umgebung unverΓ€nderlich &T, nebenlΓ€ufig nutzbar)
ββββββββββββββββ
β FnOnce β (Konsumiert Umgebung / Move, 1x aufrufbar)
ββββββββ¬ββββββββ
β²
ββββββββ΄ββββββββ
β FnMut β (VerΓ€ndert Umgebung &mut, mehrfach aufrufbar)
ββββββββ¬ββββββββ
β²
ββββββββ΄ββββββββ
β Fn β (Liest Umgebung unverΓ€nderlich &T, nebenlΓ€ufig nutzbar)
ββββββββββββββββ
// 1. Fn: Liest Referenz
let factor = 2;
let double = |x: i32| x * factor;
// 2. FnMut: Mutiert Zustand
let mut count = 0;
let mut inc = || { count += 1; count };
// 3. FnOnce / move: Γbernimmt Ownership
let text = String::from("Rust");
let consume = move || println!("Taken: {}", text);
π‘οΈ 2. Der Iterator Trait & Adapter Pipelines
In Rust sind Iteratoren lazy (trΓ€ge) – Berechnungen finden erst statt, wenn ein Consumer wie .collect(), .sum() oder .fold() die Pipeline konsumiert.
pub trait Iterator {
type Item;
fn next(&mut self) -> Option<Self::Item>;
}
// Zero-Cost Pipeline:
let sum_of_even_squares: u64 = (1..=100)
.filter(|&x| x % 2 == 0)
.map(|x| x * x)
.sum();
π Didaktische Analogie: Das Montageband in der Fabrik
Ein Iterator ist wie ein FlieΓband: .filter() und .map() sind Bearbeitungsstationen am Band. Das Band bewegt sich jedoch kein StΓΌck, bis am Ende der Fertigwaren-EmpfΓ€nger (.collect()) das Paket anfordert!
π 3. Cheat-Sheet: Wichtige Iterator-Adapter
| Adapter / Consumer | Signatur-Beispiel | Beschreibung |
|---|---|---|
.map(f) |
iter.map(|x| x * 2) |
Transformiert jedes Element 1:1 |
.filter(p) |
iter.filter(|x| *x > 10) |
BehΓ€lt nur Elemente, die dem PrΓ€dikat entsprechen |
.fold(init, f) |
iter.fold(0, |acc, x| acc + x) |
Aggregiert alle Werte in einen Akkumulator |
.collect() |
iter.collect::<Vec<_>>() |
Wandelt Iterator in eine konkrete Kollektion um |