rust / intermediate
Snippet
Iterator-Adapter und Faulheit (Lazy Evaluation)
Rust-Iteratoren verwenden Lazy Evaluation, was bedeutet, dass Operationen erst ausgeführt werden, wenn sie durch eine Terminal-Operation wie 'collect', 'sum' oder 'for_each' verbraucht werden. Dies ermöglicht das Verketten mehrerer Adapter wie filter, map, skip und take ohne Zwischenallokationen. Iterator-Adapter transformieren den Iterator, ohne ihn zu verbrauchen, und flat_map kann jedes Element in mehrere Werte erweitern.
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
24
25
26
27
fn main() {let numbers = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];let result: Vec<i32> = numbers.iter().filter(|&&x| x % 2 == 0).map(|x| x * x).skip(1).take(2).collect();println!("Result: {:?}", result);let sum_of_squares: i32 = numbers.iter().filter(|&&x| x > 3).map(|x| x * x).sum();println!("Sum of squares (x > 3): {}", sum_of_squares);let chained: Vec<i32> = (1..=5).flat_map(|x| std::iter::repeat(x).take(x)).collect();println!("FlatMap result: {:?}", chained);}
Erklärung
1
.iter()
Erstellt einen nicht-verbrauchenden Iterator über die Vektorreferenz
2
.filter(|&&x| x % 2 == 0)
Prädikat-Closure behält nur gerade Zahlen; &&x nötig zur Dereferenzierung von &&i32
3
.map(|x| x * x)
Transformiert jedes Element durch Quadrierung
4
.skip(1).take(2)
Überspringt erstes Element, nimmt dann die nächsten zwei aus dem gefilterten Strom
5
.collect()
Terminal-Operation verbraucht Iterator und sammelt in Vec
6
.flat_map(|x| std::iter::repeat(x).take(x))
Mapt jeden x-Wert zu x Kopien seiner selbst, flacht in eine einzige Sequenz ab