Iterable & Iterator
Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy. Lektion 68 von 110.
Jedes Mal, wenn du eine for-in-Schleife für eine List, ein Set oder eine andere Sammlung verwendest, arbeitest du im Hintergrund mit Iterable und Iterator. Wenn du diese Konzepte verstehst, kannst du deine eigenen Klassen erstellen, über die iteriert werden kann.
Ein Iterable ist jedes Objekt, das eine Folge von Werten erzeugen kann. Es hat eine zentrale Anforderung: einen iterator-Getter, der einen Iterator zurückgibt. Der Iterator bewegt sich tatsächlich Schritt für Schritt durch die Elemente:
var numbers = [1, 2, 3];
var iterator = numbers.iterator;
while (iterator.moveNext()) {
print(iterator.current); // 1, dann 2, dann 3
}Die Methode moveNext() rückt zum nächsten Element vor und gibt true zurück, wenn eines vorhanden ist, oder false, wenn der Vorgang abgeschlossen ist. Die Eigenschaft current liefert das aktuelle Element.
Um Ihre eigene Klasse iterierbar zu machen, implementieren Sie das Iterable-Interface:
class Countdown extends Iterable<int> {
final int start;
Countdown(this.start);
@override
Iterator<int> get iterator => CountdownIterator(start);
}
class CountdownIterator implements Iterator<int> {
int _current;
CountdownIterator(int start) : _current = start + 1;
@override
int get current => _current;
@override
bool moveNext() {
if (_current > 0) {
_current--;
return true;
}
return false;
}
}
void main() {
for (var n in Countdown(3)) {
print(n); // 3, 2, 1, 0
}
}Jetzt funktioniert Countdown mit for-in-Schleifen und allen Iterable-Methoden wie map, where und fold. Dieses Muster ist unerlässlich, wenn du benutzerdefinierte Sammlungen erstellst, die sich nahtlos in das Collection-Ökosystem von Dart integrieren.
Aufgabe
EinfachErstellen wir einen benutzerdefinierten Bereichsgenerator, der mit einer for-in-Schleife durchlaufen werden kann! Du erstellst deine eigenen Klassen Iterable und Iterator, um eine Zahlenfolge innerhalb eines angegebenen Bereichs zu erzeugen.
Du organisierst deinen Code in zwei Dateien:
range.dart: Erstelle zwei Klassen, die zusammenarbeiten, um eine Zahlenfolge zu erzeugen:- Eine Klasse
RangeIterator, dieIterator<int>implementiert. Sie soll die aktuelle Position verfolgen und wissen, wann sie stoppen muss. Der Iterator startet vor dem ersten Element, daher mussmoveNext()aufgerufen werden, bevor aufcurrentzugegriffen wird. - Eine Klasse
Range, dieIterable<int>erweitert. Sie übernimmt in ihrem Konstruktor einenstart- und einenend-Wert und stellt eineniterator-Getter bereit, der einenRangeIteratorzurückgibt.
startals auchendeinschließen. Zum Beispiel sollRange(1, 5)Folgendes erzeugen: 1, 2, 3, 4, 5.- Eine Klasse
main.dart: Importiere deine Bereichsdatei und demonstriere dein benutzerdefiniertes Iterable:- Erstelle ein
Range(1, 5)und verwende einefor-in-Schleife, um jede Zahl in einer eigenen Zeile auszugeben - Gib eine leere Zeile aus
- Erstelle ein
Range(10, 13)und verwende die Methodemap, um jeden Wert zu verdoppeln, und gib anschließend die resultierende Liste aus
- Erstelle ein
Da deine Klasse Range Iterable erweitert, erhält sie automatisch Zugriff auf alle leistungsstarken Sammlungsmethoden wie map, where und fold – das ist das Schöne daran, die Iterable-Schnittstelle zu implementieren!
Erwartete Ausgabe:
1
2
3
4
5
[20, 22, 24, 26]Probier es selbst
import 'range.dart';
void main() {
// TODO: Erstelle eine Range(1, 5) und verwende eine for-in-Schleife, um jede Zahl auszugeben
// TODO: Gib eine Leerzeile aus
// TODO: Erstelle eine Range(10, 13), verwende map, um jeden Wert zu verdoppeln, und gib die Liste aus
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienBibliotheken & ImportsEinführung in die OOPKlassen vs. ObjekteDas Schlüsselwort thisMethodenInstanzvariablenGrundlagen von KonstruktorenRückblick – Einfacher Taschenrechner4Null-Sicherheit
Einführung in die Null-SicherheitNullable vs. Non-NullableDie Operatoren ? und !Late-Schlüsselwort und Null-SicherheitNull-bewusste OperatorenNull-Sicherheit in KlassenRückblick – Benutzers профilsystem7Abstrakte Klassen & Interfaces
Abstrakte KlassenAbstrakte MethodenInterfaces in DartImplizite InterfacesImplementieren vs. ErweiternMehrere InterfacesZusammenfassung – Formrechner10Collections & Generics
Übersicht über List, Set und MapTypsichere CollectionsGenerische KlassenGenerische MethodenGenerische EinschränkungenIterable & IteratorRückblick – Generischer Speicher13Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungErweiterungsmethodenAufrufbare KlassenVersiegelte Klassen (Dart 3)Records (Dart 3)Muster & Matching (3.0)Enums mit Methoden16Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen2Konstruktoren in Dart
StandardkonstruktorBenannte KonstruktorenInitialisierungslistenKonstantenkonstruktorenFactory-KonstruktorenWeiterleitende KonstruktorenRückblick – Shape Builder5Kapselung
Öffentliche vs. private MemberDie _-Präfix-KonventionBibliotheksweite SichtbarkeitTiefergehende Getter & SetterInformationsverbergungRückblick – Studierendendaten8Mixins
Einführung in MixinsMixins erstellenMehrere Mixins verwendenDas Schlüsselwort „on“ in MixinsMixin vs. VererbungMixin vs. SchnittstelleRückblick – Tiersystem11Spezielle Methoden
toString()-ÜberschreibunghashCode- & ==-ÜberschreibungComparable-Schnittstellecall()-MethodenoSuchMethod-ÜberschreibungWiederholung – Benutzerdefinierte Collection14Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFabrikmusterBeobachtermusterStrategiemuster17Abschließende Herausforderungen
E-Learning-PlattformBankingsystemSpielcharaktersystemFahrzeugvermietung3Klassen-Eigenschaften
Instanz- vs. statische MemberFinal- und Const-FelderLate-VariablenStatische Methoden und FelderGetter und SetterRückblick – Bankkontoverwaltung6Vererbung
Grundlegende VererbungDas Schlüsselwort superMethodenüberschreibungDie Annotation @overrideDas Schlüsselwort final für KlassenKonstruktoren und VererbungZusammenfassung – Mitarbeiterhierarchie9Polymorphismus
Grundlagen des PolymorphismusPolymorphismus über InterfacesLaufzeit-TypüberprüfungDie Operatoren is & asCovariant-SchlüsselwortZusammenfassung – ZahlungsprozessorÜbe selbstständig: Online-Dart-Compiler