Ruby : Les blocs

Ruby est mon ami… de plus en plus. Parmi les nombreuses qualités de ce langage, une de mes préférées est sans aucun doute les blocs. Un bloc, c’est tout simplement un bloc… de code. Les blocs sont utilisés entre autres afin de réaliser des boucles. Dans la grande majorité des autres langages, il y a des opérateurs spécialement conçus pour faire des itérations. Avec Ruby, on peut également réaliser une boucle d’une façon beaucoup plus intéressante. L’idée est de déléguer à un objet la responsabilité de gérer le mécanisme de la boucle… plutôt que de gérer celui-ci à l’extérieur de l’objet. Le code appelant n’a qu’à exécuter une méthode de l’objet en lui passant un bloc correspondant au code à exécuter à chaque passage dans la boucle. L’objet s’occupe ensuite d’exécuter ce bloc au moment voulu à l’aide de l’instruction yield. Vous m’excuserez pour le code non indenté mais Wordpress refuse catégoriquement les espaces dans certaines situations.

Méthode traditionnelle :

for tag in @tags
puts tag.name
end

Méthode bloc :

@tags.each do |tag|
puts tag.name
end

Avec la méthode traditionnelle, le code appelant s’occupe lui-même de parcourir la collection tandis qu’avec la méthode bloc, on ne fait qu’appeler une méthode (each) qui s’occupera de boucler. Ce qui se trouve entre les 2 barres verticales est tout simplement la liste des paramètres pour l’exécution du bloc. Dans ce cas-ci, la méthode “each” a uniquement besoin de passer un paramètre au bloc (l’élément en cours). Pour mieux comprendre, voici comment la méthode each pourrait être implémentée à l’intérieur de la classe Array (en supposant que tags est un array) :

def each
for item in items
yield(item) # yield est l’instruction qui appelle le bloc
end
end

Cet exemple n’était pas vraiment convaincant, je l’avoue. En effet, le mécanisme de la boucle ne fait que parcourir tous les items de la collection en appelant le bloc à chaque passage. Voici un exemple plus intéressant…

Méthode traditionnelle :

i=0
for i=0 to 2
puts “Joue!\n”
end

Méthode bloc :

3.times {puts “Joue!\n”}

Avec la méthode bloc, voyez comment je n’ai pas à me soucier des indexes. C’est la méthode times de la classe Integer qui se charge de tout le mécanisme interne. De mon côté, je n’ai eu qu’à ordonner de faire quelque chose un certain nombre de fois. Cela créé un niveau d’abstraction très intéressant et, à mon avis, améliore grandement la lisibilité du code.

4 commentaires sur cet article

Commentaires

  1. Dan 4 Jan

    Wow. Je n’ai rien d’autre à dire que wow.

  2. Dan 4 Jan

    Mon autre commentaire était peut-être un peu trop “inside joke”. En gros, j’aime vraiment ça.

    Un des gros avantages que je vois est de faire des boucles avec des conditions. Exemple, je veux tous les chats dont le nom est Mistigri, je pourrais faire :

    cats.loop(”Mistigri”) |cat| {
    puts cat.age;
    }

  3. Frank 4 Jan

    En plein ça, ton exemple est très bon. J’étais sûr que ça te plairait Dan.

    En passant, j’ai vraiment adoré ton “inside joke”

  4. […] C’est en lisant Ruby : Les blocs que j’ai eu la vieille habitude de me demander comment est-ce qu’Intellisense fait pour comprendre ça et faire le bon affichage? Pensée impure : je me gifle, je prie et je me regifle pour me faire pardonner. On a pris la mauvaise habitude de penser en fonction d’Intellisense, de programmer en fonction qu’il nous affiche nos méthodes et attributs dans toute leur splendeur. […]

Laisser un commentaire