Menu
Coddy logo textTech

Iterable et Iterator

Fait partie de la section Programmation Orientée Objet du Journey Dart de Coddy. Leçon 68 sur 110.

Chaque fois que vous utilisez une boucle for-in sur une List, un Set ou une autre collection, vous travaillez en réalité avec Iterable et Iterator. Comprendre ces concepts vous permet de créer vos propres classes sur lesquelles il est possible d’itérer.

Un Iterable est tout objet capable de produire une séquence de valeurs. Il a une exigence essentielle : un accesseur iterator qui renvoie un Iterator. L’Iterator est ce qui parcourt réellement les éléments un par un :

var numbers = [1, 2, 3];
var iterator = numbers.iterator;

while (iterator.moveNext()) {
  print(iterator.current);  // 1, puis 2, puis 3
}

La méthode moveNext() passe à l'élément suivant et retourne true s'il y en a un, ou false lorsqu'elle a terminé. La propriété current vous donne l'élément actuel.

Pour rendre votre propre classe itérable, implémentez l'interface 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
  }
}

Désormais, Countdown fonctionne avec les boucles for-in et toutes les méthodes Iterable telles que map, where et fold. Ce modèle est essentiel lors de la création de collections personnalisées qui s'intègrent parfaitement à l'écosystème de collections de Dart.

challenge icon

Défi

Facile

Construisons un générateur de plages personnalisé qui peut être parcouru à l'aide d'une boucle for-in ! Vous allez créer vos propres classes Iterable et Iterator pour générer une séquence de nombres dans une plage spécifiée.

Vous allez organiser votre code en deux fichiers :

  • range.dart : créez deux classes qui fonctionnent ensemble pour produire une séquence de nombres :
    • Une classe RangeIterator qui implémente Iterator<int>. Elle doit suivre la position actuelle et savoir quand s'arrêter. L'itérateur commence avant le premier élément, donc moveNext() doit être appelé avant d'accéder à current.
    • Une classe Range qui étend Iterable<int>. Elle prend une valeur start et une valeur end dans son constructeur et fournit un accesseur iterator qui renvoie un RangeIterator.
    La plage doit inclure à la fois start et end. Par exemple, Range(1, 5) doit produire : 1, 2, 3, 4, 5.
  • main.dart : importez votre fichier de plage et présentez votre itérable personnalisé :
    • Créez un Range(1, 5) et utilisez une boucle for-in pour afficher chaque nombre sur sa propre ligne
    • Affichez une ligne vide
    • Créez un Range(10, 13) et utilisez la méthode map pour doubler chaque valeur, puis affichez la liste obtenue

Comme votre classe Range étend Iterable, elle accède automatiquement à toutes les puissantes méthodes de collection comme map, where et fold — c'est tout l'intérêt d'implémenter l'interface Iterable !

Résultat attendu :

1
2
3
4
5

[20, 22, 24, 26]

Essayez vous-même

import 'range.dart';

void main() {
  // TODO : Créer un Range(1, 5) et utiliser une boucle for-in pour afficher chaque nombre
  
  
  // TODO : Afficher une ligne vide
  
  
  // TODO : Créer un Range(10, 13), utiliser map pour doubler chaque valeur et afficher la liste
  
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation Orientée Objet

Entraînez-vous par vous-même : Compilateur Dart en ligne