Iterable e Iterator
Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 68 di 110.
Ogni volta che usi un ciclo for-in su una List, un Set o un’altra raccolta, stai lavorando con Iterable e Iterator dietro le quinte. Comprendere questi concetti ti permette di creare classi personalizzate su cui è possibile eseguire un ciclo.
Un Iterable è qualsiasi oggetto in grado di produrre una sequenza di valori. Ha un requisito fondamentale: un getter iterator che restituisce un Iterator. È l'Iterator che scorre effettivamente gli elementi uno per uno:
var numbers = [1, 2, 3];
var iterator = numbers.iterator;
while (iterator.moveNext()) {
print(iterator.current); // 1, poi 2, poi 3
}Il metodo moveNext() avanza all'elemento successivo e restituisce true se ce n'è uno, oppure false quando è terminato. La proprietà current ti fornisce l'elemento corrente.
Per rendere iterabile una tua classe, implementa l'interfaccia Iterable:
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
}
}Ora Countdown funziona con i cicli for-in e tutti i metodi Iterable come map, where e fold. Questo schema è essenziale quando crei collezioni personalizzate che si integrano perfettamente con l’ecosistema di collezioni di Dart.
Sfida
FacileCostruiamo un generatore di intervalli personalizzato su cui è possibile iterare usando un ciclo for-in! Creerai le tue classi Iterable e Iterator per generare una sequenza di numeri entro un intervallo specificato.
Organizzerai il codice in due file:
range.dart: Crea due classi che collaborano per produrre una sequenza di numeri:- Una classe
RangeIteratorche implementaIterator<int>. Deve tenere traccia della posizione corrente e sapere quando fermarsi. L’iteratore inizia prima del primo elemento, quindi è necessario chiamaremoveNext()prima di accedere acurrent. - Una classe
Rangeche estendeIterable<int>. Accetta un valorestarte un valoreendnel costruttore e fornisce un getteriteratorche restituisce unRangeIterator.
startsiaend. Per esempio,Range(1, 5)deve produrre: 1, 2, 3, 4, 5.- Una classe
main.dart: Importa il file dell’intervallo e mostra il tuo iterabile personalizzato:- Crea un
Range(1, 5)e usa un ciclofor-inper stampare ogni numero su una riga separata - Stampa una riga vuota
- Crea un
Range(10, 13)e usa il metodomapper raddoppiare ogni valore, quindi stampa la lista risultante
- Crea un
Poiché la tua classe Range estende Iterable, ottiene automaticamente accesso a tutti i potenti metodi delle collezioni, come map, where e fold: ecco la bellezza di implementare l’interfaccia Iterable!
Output previsto:
1
2
3
4
5
[20, 22, 24, 26]Provalo tu
import 'range.dart';
void main() {
// TODO: Crea un Range(1, 5) e usa un ciclo for-in per stampare ogni numero
// TODO: Stampa una riga vuota
// TODO: Crea un Range(10, 13), usa map per raddoppiare ogni valore e stampa la lista
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniLibrerie e importazioniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave thisMetodiVariabili di istanzaFondamenti dei costruttoriRiepilogo - Calcolatrice semplice4Sicurezza dei valori null
Introduzione alla sicurezza dei valori nullNullable e non nullableGli operatori ? e !La keyword late e la sicurezza dei valori nullOperatori null-awareSicurezza dei valori null nelle classiRiepilogo - Sistema di profili utente7Classi astratte e interfacce
Classi astratteMetodi astrattiInterfacce in DartInterfacce impliciteImplementare vs estendereInterfacce multipleRiepilogo - Calcolatore di forme10Collezioni e generici
Panoramica di List, Set e MapCollezioni sicure rispetto ai tipiClassi genericheMetodi genericiVincoli sui genericiIterable e IteratorRiepilogo - Archiviazione generica13Concetti avanzati di OOP
Composizione vs ereditarietàMetodi di estensioneClassi chiamabiliClassi sealed (Dart 3)Record (Dart 3)Pattern e matching (3.0)Enum con metodi16Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente2I costruttori in Dart
Costruttore predefinitoCostruttori con nomeListe di inizializzazioneCostruttori costantiCostruttori factoryCostruttori di reindirizzamentoRiepilogo - Crea forme5Incapsulamento
Membri pubblici e privatiConvenzione del prefisso _Visibilità a livello di libreriaApprofondimento su getter e setterNascondimento delle informazioniRiepilogo - Registri degli studenti8Mixin
Introduzione ai MixinCreare MixinUsare più MixinParola chiave on nei MixinMixin vs ereditarietàMixin vs interfacciaRiepilogo - Sistema animale11Metodi speciali
Sovrascrittura di toString()Sovrascrittura di hashCode e ==Interfaccia ComparableMetodo call()Sovrascrittura di noSuchMethodRiepilogo - Collezione personalizzata14Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneSingletonFactoryObserverStrategy3Proprietà delle classi
Membri di istanza e staticiCampi final e constVariabili lateMetodi e campi staticiGetter e setterRiepilogo - Gestore di conti bancari6Ereditarietà
Ereditarietà di baseLa parola chiave superOverride dei metodiL’annotazione @overrideLa parola chiave final per le classiCostruttori ed ereditarietàRiepilogo - Gerarchia dei dipendenti9Polimorfismo
Fondamenti di polimorfismoPolimorfismo tramite interfacceControllo del tipo a runtimeGli operatori is e asParola chiave covariantRiepilogo - Elaboratore di pagamenti12OOP asincrona
Future e async/awaitNozioni di base sugli streamController degli streamCostruttori asincroniAsync nei metodi di classeRiepilogo - Recupero dei dati15Pattern di progettazione Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern RepositoryEsercitati da solo: Compilatore Dart online