Ruby/Itérateurs
Les itérateurs permettent d'accéder, tout comme la boucle for
, à tous les éléments d'un ensemble un à un.
Parcourir des nombres
modifierPour chaque nombre d'un ensemble
modifierComme nous l'avons déjà vu, une boucle for
permet de parcourir un ensemble de nombres de la manière la plus simple qui soit, par exemple :
n prend successivement la valeur de 2, 3, 4, 5, 6 et 7.
Il est possible de réécrire cette boucle à l'aide d'une méthode : upto
(Integer#upto
). Cette méthode de la classe Integer
s'applique à un entier, elle l'incrémente et exécute un bloc d'instructions jusqu'à atteindre le nombre passé en paramètre. Voici un exemple permettant d'obtenir la même chose que la boucle du dessus :
Le bloc |x| puts x
, délimité par des accolades est exécuté 6 fois, x prend successivement les valeurs 2, 3, 4, 5, 6 et 7. Le nom de la variable, ici x, est mis entre deux barres et peut être changé. Le bloc de code peut être délimité par les mots-clés do
et end
(à la place des accolades) et peut contenir autant d'instructions que vous le voulez (ces deux remarques sont valables pour tout ce que nous verrons dans ce chapitre).
Il existe une méthode permettant de faire la même chose à l’envers : downto
(Integer#downto
) :
x prend les valeurs 7, 6, 5, 4, 3 et 2. Les remarques faites plus haut sont valables ici aussi.
Un certain nombre de fois
modifierNous pouvons exécuter un bloc de code un certain nombre de fois, c’est ce que nous permet la méthode times
(Integer#times
). Elle s'applique à un entier et exécute le bloc qu'on lui fournit autant de fois ; voici un exemple :
Ainsi, l'instruction puts x
est exécutée 2 fois (times
est appelée sur l'entier 2). L'itération commençant à 0, x prend successivement les valeurs 0 et 1.
Parcourir un tableau
modifierNous disposons de la méthode each
(Array#each
) qui exécute un bloc d'instructions pour chaque élément du tableau sur lequel on l'invoque. Considérons ce tableau :
Nous utilisons each
de cette manière :
Le fonctionnement est le même que celui de times
: n prend successivement les valeurs des éléments du tableau array
, à savoir "zero"
, "un"
et "deux"
.
puts n
est exécuté pour chaque valeur de n.
Voici l'équivalent avec une boucle for
:
Parcourir une chaîne de caractères
modifierUne chaîne de caractères peut être considérée comme un tableau et peut donc être parcourue tout aussi simplement. Considérons cette chaîne de caractères :
Ainsi, notre chaîne équivaut à :
La classe String
dispose, tout comme la classe Array
, d'une méthode each
(String#each
) permettant de parcourir les chaînes de caractères. Le fonctionnement est similaire à celui de Array#each
:
puts l
est exécuté pour chaque portion de la chaîne sur laquelle on l'appelle.
La chaîne a donc été découpée suivant les sauts de ligne. En effet, la méthode String#each
peut prendre en argument un caractère afin de délimiter les portions de chaînes, par défaut ce caractère est \n
. Si nous voulons par exemple traiter la chaîne mot par mot, nous précisons que le délimiteur doit être un espace :
La boucle for
nous permet d'obtenir le même résultat que each
sans paramètre (c'est-à-dire en considérant les retours à la ligne comme des séparateurs) :
Une chaîne de caractères est en fait un tableau d'octets. Vous disposez d'une autre méthode, each_byte
(String#each_byte
) qui vous permet de traiter une chaîne octet par octet (un caractère occupant la place d'un octet en mémoire). Voici comment traiter une chaîne caractère par caractère, après une conversion à l'aide de la méthode chr
:
Pour ne pas entrer dans les détails, souvenez-vous seulement que c.chr
désigne successivement chaque caractère de la chaîne sur laquelle est invoquée la méthode each_byte
.
Parcourir un hachage
modifierParcourir un hachage se fait quasiment de la même manière que pour un tableau : à l'aide de la méthode each
de la classe Hash
(Hash#each
). Considérons ce hachage :
Pour parcourir les paires clés-valeurs du hachage, nous procédons comme suit :
k et v (on utilise plus généralement key
et value
), séparés par une virgule, représentent successivement les clés et les valeurs associées du hachage sur lequel est appelée la méthode each
. Quand k vaut un
, v est égal à 1.
Une boucle for
peut là aussi nous permettre d'obtenir le même résultat :