0 Tage Serie
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.