Aller au contenu

Ruby/Itérateurs

Leçons de niveau 14
Une page de Wikiversité, la communauté pédagogique libre.
Début de la boite de navigation du chapitre
Itérateurs
Icône de la faculté
Chapitre no 12
Leçon : Ruby
Chap. préc. :Autres variables
Chap. suiv. :Symboles
fin de la boite de navigation du chapitre
En raison de limitations techniques, la typographie souhaitable du titre, « Ruby : Itérateurs
Ruby/Itérateurs
 », n'a pu être restituée correctement ci-dessus.


Parcourir des nombres

[modifier | modifier le wikicode]

Pour chaque nombre d'un ensemble

[modifier | modifier le wikicode]

Comme 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 :

Début de l'exemple
Fin de l'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 :

Début de l'exemple
Fin de l'exemple


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).

Début de l'exemple
Fin de l'exemple


Il existe une méthode permettant de faire la même chose à l’envers : downto (Integer#downto) :

Début de l'exemple
Fin de l'exemple


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

[modifier | modifier le wikicode]

Nous 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 :

Début de l'exemple
Fin de l'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

[modifier | modifier le wikicode]

Nous 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 :

Début de l'exemple
Fin de l'exemple


Nous utilisons each de cette manière :

Début de l'exemple
Fin de l'exemple


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 :

Début de l'exemple
Fin de l'exemple


Parcourir une chaîne de caractères

[modifier | modifier le wikicode]

Une 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 :

Début de l'exemple
Fin de l'exemple



Ainsi, notre chaîne équivaut à :

Début de l'exemple
Fin de l'exemple


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 :

Début de l'exemple
Fin de l'exemple


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 :

Début de l'exemple
Fin de l'exemple


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) :

Début de l'exemple
Fin de l'exemple


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 :

Début de l'exemple
Fin de l'exemple


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

[modifier | modifier le wikicode]

Parcourir 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 :

Début de l'exemple
Fin de l'exemple


Pour parcourir les paires clés-valeurs du hachage, nous procédons comme suit :

Début de l'exemple
Fin de l'exemple


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 :

Début de l'exemple
Fin de l'exemple