Benutzerdefinierte Iteratoren
Iterator implementieren
Benutzerdefinierte Iteratoren ist eine kostenlose Learn Rust Coding-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Learn Rust Coding-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Learn Rust Coding-Kurs umfasst insgesamt 4 Lektionen.
Einen eigenen Iterator erstellen
Sie sind nicht auf eingebaute Iteratoren beschränkt. Wenn Sie den Iterator-Trait für Ihren eigenen Typ implementieren, erhält dieser automatisch jeden Adapter und Consumer.
Sie müssen nur den Item-Typ und eine next-Methode bereitstellen.
Eine Counter-Struktur
Beginnen Sie mit einer Struktur, die den Zustand des Iterators enthält. Ein einfacher Zähler benötigt nur einen aktuellen Wert.
struct Counter {
count: u32,
}
fn main() {
let c = Counter { count: 0 };
println!("start at {}", c.count);
}next implementieren
Implementieren Sie Iterator für die Struktur. Setzen Sie type Item und schreiben Sie anschließend next, um den Zustand weiterzuschalten und bis zu einer Abbruchbedingung Some zurückzugeben; danach wird None zurückgegeben.
struct Counter { count: u32 }
impl Iterator for Counter {
type Item = u32;
fn next(&mut self) -> Option<u32> {
if self.count < 5 {
self.count += 1;
Some(self.count)
} else {
None
}
}
}
fn main() {
let mut c = Counter { count: 0 };
println!("{:?}", c.next());
println!("{:?}", c.next());
}In einer for-Schleife verwenden
Sobald next vorhanden ist, funktioniert Ihr Typ in einer for-Schleife wie jeder andere Standarditerator.
struct Counter { count: u32 }
impl Iterator for Counter {
type Item = u32;
fn next(&mut self) -> Option<u32> {
if self.count < 5 { self.count += 1; Some(self.count) } else { None }
}
}
fn main() {
for n in (Counter { count: 0 }) {
print!("{} ", n);
}
println!();
}Adapter und Consumer gratis
Da Sie nur eine Methode implementiert haben, steht Ihnen nun die gesamte Iterator-Werkzeugkiste zur Verfügung. Hier summieren wir die Quadrate von Wertepaaren eines Zählers.
struct Counter { count: u32 }
impl Iterator for Counter {
type Item = u32;
fn next(&mut self) -> Option<u32> {
if self.count < 5 { self.count += 1; Some(self.count) } else { None }
}
}
fn main() {
let total: u32 = Counter { count: 0 }.map(|x| x * 2).sum();
println!("{}", total);
}Eine Konstruktor-Methode
Fügen Sie eine new-Funktion hinzu, damit Benutzer nicht auf interne Felder zugreifen müssen. Das ist übersichtlicher und ermöglicht es Ihnen, das Feld privat zu halten.
struct Counter { count: u32 }
impl Counter {
fn new() -> Counter { Counter { count: 0 } }
}
impl Iterator for Counter {
type Item = u32;
fn next(&mut self) -> Option<u32> {
if self.count < 3 { self.count += 1; Some(self.count) } else { None }
}
}
fn main() {
let v: Vec<u32> = Counter::new().collect();
println!("{:?}", v);
}Ein Fibonacci-Iterator
Iteratoren können einen umfangreicheren Zustand verwalten. Ein Fibonacci-Generator speichert die letzten beiden Werte und aktualisiert sie bei jedem Aufruf von next.
struct Fib { a: u64, b: u64 }
impl Iterator for Fib {
type Item = u64;
fn next(&mut self) -> Option<u64> {
let current = self.a;
self.a = self.b;
self.b = current + self.b;
Some(current)
}
}
fn main() {
let fib = Fib { a: 0, b: 1 };
let seq: Vec<u64> = fib.take(8).collect();
println!("{:?}", seq);
}Unendliche Iteratoren sind unproblematisch
Der Fibonacci-Iterator gibt niemals None zurück — er ist unendlich. Das ist sicher, weil durch die verzögerte Auswertung Werte nur bei Bedarf erzeugt werden. Verwenden Sie take, um ihn zu begrenzen.
struct Fib { a: u64, b: u64 }
impl Iterator for Fib {
type Item = u64;
fn next(&mut self) -> Option<u64> {
let c = self.a;
self.a = self.b;
self.b = c + self.b;
Some(c)
}
}
fn main() {
let big = Fib { a: 0, b: 1 }.nth(20);
println!("{:?}", big);
}Über einen Wrapper-Typ iterieren
Oft implementieren Sie Iterator für eine Hilfsstruktur, die Ihre Daten ausleiht. Hier liefert ein Stepper jede zweite Zahl aus einem darin gespeicherten Bereich.
struct EvenUpTo { current: u32, max: u32 }
impl Iterator for EvenUpTo {
type Item = u32;
fn next(&mut self) -> Option<u32> {
if self.current > self.max { return None; }
let value = self.current;
self.current += 2;
Some(value)
}
}
fn main() {
let evens: Vec<u32> = (EvenUpTo { current: 0, max: 10 }).collect();
println!("{:?}", evens);
}Warum eigene Iteratoren erstellen?
Mit eigenen Iteratoren können Sie Werte streamen, ohne eine vollständige Collection zu allokieren, unendliche oder berechnete Sequenzen modellieren und Aufrufern eine vertraute, komponierbare Schnittstelle bieten.
Eine kleine next-Methode erschließt das gesamte Ökosystem.
Tipps zum Entwurf
Halten Sie Ihren Zustand möglichst klein, geben Sie am Ende genau einmal None zurück (bei unendlichen Iteratoren nie) und vermeiden Sie aufwendige Arbeit in next, damit die verzögerte Auswertung kostengünstig bleibt.
Kurzer Test
Den Iterator-Trait implementieren.
Zusammenfassung
Sie haben eigene Iteratoren erstellt:
- Speichern Sie den Zustand in einer Struktur und implementieren Sie anschließend
impl Iterator - Definieren Sie
type Itemund schreiben Sienext - Sie erhalten sofort Adapter und Consumer ohne zusätzlichen Aufwand
- Iteratoren können endlich oder unendlich sein; verwenden Sie
take, um unendliche Iteratoren zu begrenzen
Häufig gestellte Fragen
Ist die Lektion „Benutzerdefinierte Iteratoren“ kostenlos?
Ja — der vollständige Text von „Benutzerdefinierte Iteratoren“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Learn Rust Coding-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Learn Rust Coding-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Benutzerdefinierte Iteratoren“?
Iterator implementieren Du übst Learn Rust Coding mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Learn Rust Coding zu starten?
Keine Vorkenntnisse erforderlich. Learn Rust Coding auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Benutzerdefinierte Iteratoren“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Learn Rust Coding-Lektion Code schreiben und ausführen?
Ja. Jede Learn Rust Coding-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Das Iterator-Trait
- map, filter, collect
- Adapter und Consumer
- Benutzerdefinierte Iteratoren