rust / expert
Snippet
Konstruktion von benutzerdefinierten Lazy-Array-Filter-Kombinatoren
Dieses Beispiel zeigt, wie ein benutzerdefinierter Iterator entworfen wird, der ein Array-Slice unter Verwendung einer Prädikatfunktion träge (lazy) verarbeitet, wodurch Zwischenallokationen vermieden und pipelinebasierte Kontrollflüsse manuell implementiert werden.
snippet.rs
rust
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
28
29
30
31
32
33
34
35
36
37
38
struct LazyFilter<'a, T, F> {slice: &'a [T],predicate: F,index: usize,}impl<'a, T, F> LazyFilter<'a, T, F>whereF: Fn(&T) -> bool,{fn new(slice: &'a [T], predicate: F) -> Self {Self { slice, predicate, index: 0 }}}impl<'a, T, F> Iterator for LazyFilter<'a, T, F>whereF: Fn(&T) -> bool,{type Item = &'a T;fn next(&mut self) -> Option<Self::Item> {while self.index < self.slice.len() {let element = &self.slice[self.index];self.index += 1;if (self.predicate)(element) {return Some(element);}}None}}fn process_data() -> Vec<i32> {let numbers = [1, 2, 3, 4, 5, 6];let filter = LazyFilter::new(&numbers, |&x| x % 2 == 0);filter.copied().collect()}
Erklärung
1
struct LazyFilter<'a, T, F>
Hält eine lebensdauergebundene Slice-Referenz, ein generisches Prädikat-Closure und den aktuellen Index-Offset.
2
impl<'a, T, F> Iterator for LazyFilter
Implementiert das Iterator-Trait, um die Integration mit den Standard-Schleifenkontrollen von Rust zu ermöglichen.
3
while self.index < self.slice.len()
Schleift sequenziell durch die internen Elemente, ohne dynamisch Speicher zu allokieren.
4
if (self.predicate)(element)
Ruft das Prädikat-Closure auf, um zu bestimmen, ob die Referenz zurückgegeben oder übersprungen werden soll.