Retour au cours

itérateurs et blocs : la méthode ruby

Objectifs

  • Comprendre ce qu’est un bloc de code, une des fonctionnalités les plus puissantes de Ruby.
  • Utiliser l’itérateur .each pour parcourir des collections (tableaux, hashes).
  • Utiliser l’itérateur .times pour répéter une action un nombre de fois défini.
  • Choisir entre la syntaxe de bloc do...end et {...}.

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 :

  1. do...end : La convention est de l’utiliser pour des blocs qui tiennent sur plusieurs lignes.
  2. {...} : 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 boucles for ou while lorsque c’est possible.
  • Utilisez do...end pour les blocs multi-lignes et {...} pour les blocs sur une seule ligne. C’est une convention forte qui améliore la lisibilité.

Exercices

  1. Répétition avec .times :

    • Écrivez un script qui affiche “Ruby, c’est la classe !” 5 fois, en utilisant l’itérateur .times.
  2. Parcourir un tableau :

    • Créez un tableau de vos trois langages de programmation préférés.
    • Utilisez .each pour afficher chaque langage sur une ligne, précédé de “J’aime programmer en ”.
  3. Parcourir un hash :

    • Créez un hash contact avec les clés :email et :telephone.
    • Utilisez .each pour afficher chaque information dans le format “email: exemple@email.com”.
  4. Table de multiplication :

    • Utilisez l’itérateur .times ou 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.