Objectifs
- Comprendre ce qu’est un bloc de code, une des fonctionnalités les plus puissantes de Ruby.
- Utiliser l’itérateur
.eachpour parcourir des collections (tableaux, hashes). - Utiliser l’itérateur
.timespour répéter une action un nombre de fois défini. - Choisir entre la syntaxe de bloc
do...endet{...}.
En Ruby, la manière la plus courante et la plus “idiomatique” de faire des boucles n’est pas avec for ou while, mais avec des itérateurs.
Les Blocs : Des morceaux de code anonymes
Un bloc est un morceau de code que vous pouvez passer à une méthode. La méthode peut alors exécuter ce code une ou plusieurs fois. C’est un concept fondamental en Ruby.
Il y a deux syntaxes pour définir un bloc :
do...end: La convention est de l’utiliser pour des blocs qui tiennent sur plusieurs lignes.{...}: La convention est de l’utiliser pour des blocs courts qui tiennent sur une seule ligne.
L’itérateur .each : Le standard pour parcourir
La méthode .each est disponible sur la plupart des collections (comme les Array et les Hash). Elle prend un bloc et l’exécute pour chaque élément de la collection.
sur un Tableau
.each passe chaque élément, un par un, en paramètre au bloc (entre les |...|).
fruits = ["pomme", "poire", "banane"]
fruits.each do |fruit|
puts "Fruit du jour : #{fruit.capitalize}"
end
Ceci est considéré comme plus lisible et plus sûr qu’une boucle for fruit in fruits.
sur un Hash
.each sur un hash vous donne accès à la fois à la clé et à la valeur.
config = { host: "localhost", port: 5432 }
config.each do |cle, valeur|
puts "Configuration -> #{cle}: #{valeur}"
end
L’itérateur .times : Répéter N fois
La classe Integer dispose de la méthode .times, qui exécute un bloc un nombre de fois donné. C’est une manière très expressive de faire une boucle simple.
# Exécute le bloc 3 fois
3.times do
puts "Hip hip hip, hourra !"
end
# Le bloc peut aussi prendre un paramètre : le tour de boucle actuel (de 0 à n-1)
5.times do |i|
puts "Tour numéro #{i}" # i vaudra 0, 1, 2, 3, 4
end
Itérateurs vs. Boucles for/while
Pourquoi la communauté Ruby préfère-t-elle les itérateurs ?
- Plus déclaratif : On ne décrit pas comment boucler (avec un compteur, une condition…), mais ce que l’on veut faire (“pour chaque fruit, fais ceci”).
- Portée des variables plus propre : Dans une boucle
for, la variable d’itération “fuit” et reste accessible après la boucle. Avec un itérateur, la variable du bloc (|fruit|) n’existe qu’à l’intérieur du bloc. - Chaînage : Les itérateurs peuvent être enchaînés de manière très puissante, ce qui est au cœur du style de programmation fonctionnelle en Ruby.
# Exemple plus avancé de chaînage :
# Prend une liste, garde les nombres pairs, les multiplie par 2
[1, 2, 3, 4].select { |n| n.even? }.map { |n| n * 2 } # => [4, 8]
Bonnes pratiques
- Privilégiez toujours les itérateurs (
.each,.times, etc.) aux bouclesforouwhilelorsque c’est possible. - Utilisez
do...endpour les blocs multi-lignes et{...}pour les blocs sur une seule ligne. C’est une convention forte qui améliore la lisibilité.
Exercices
-
Répétition avec
.times:- Écrivez un script qui affiche “Ruby, c’est la classe !” 5 fois, en utilisant l’itérateur
.times.
- Écrivez un script qui affiche “Ruby, c’est la classe !” 5 fois, en utilisant l’itérateur
-
Parcourir un tableau :
- Créez un tableau de vos trois langages de programmation préférés.
- Utilisez
.eachpour afficher chaque langage sur une ligne, précédé de “J’aime programmer en ”.
-
Parcourir un hash :
- Créez un hash
contactavec les clés:emailet:telephone. - Utilisez
.eachpour afficher chaque information dans le format “email: exemple@email.com”.
- Créez un hash
-
Table de multiplication :
- Utilisez l’itérateur
.timesou un “range” avec.each((1..10).each do |i|) pour afficher la table de multiplication de 7 (de 1 à 10). - Sortie attendue : “7 x 1 = 7”, “7 x 2 = 14”, etc.
- Utilisez l’itérateur