rust / expert
Snippet
Entwurf von Lending-Iteratoren unter Verwendung generischer assoziierter Typen
Standard-Rust-Iteratoren liefern Elemente mit Lebensdauern, die unabhängig vom Iterator selbst sind. Lending-Iteratoren (oder Streaming-Iteratoren) nutzen Generic Associated Types (GATs), um die Lebensdauer des gelieferten Elements direkt an die Lebensdauer der veränderlichen Ausleihe des Iterators in `next` zu binden, wodurch Zero-Copy-Fenster über interne Puffer ermöglicht 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
pub trait LendingIterator {type Item<'a> where Self: 'a;fn next(&mut self) -> Option<Self::Item<'_>>;}pub struct SlidingWindow<'a, T> {slice: &'a [T],index: usize,width: usize,}impl<'a, T> LendingIterator for SlidingWindow<'a, T> {type Item<'b> = &'b [T] where Self: 'b;fn next(&mut self) -> Option<Self::Item<'_>> {if self.index + self.width <= self.slice.len() {let window = &self.slice[self.index..self.index + self.width];self.index += 1;Some(window)} else {None}}}
Erklärung
1
type Item<'a> where Self: 'a;
Deklariert einen generischen assoziierten Typ, der einen Lebensdauerparameter akzeptiert, sodass das zurückgegebene Element vom Iterator ausleihen kann.
2
fn next(&mut self) -> Option<Self::Item<'_>>;
Bindet die Lebensdauer des zurückgegebenen Elements direkt an die Lebensdauer der veränderlichen Ausleihe von self.