Contactez-nous

Concept : les blocs en Ruby (do...end et {...})

Qu'est-ce qu'un bloc en Ruby ? Découvrez ce concept fondamental, la syntaxe do...end vs {...}, et pourquoi ils sont au coeur des itérateurs comme .each. Maîtriser les blocs est essentiel pour écrire du code Ruby élégant et puissant.

Qu'est-ce qu'un bloc de code exactement ?

Un bloc en Ruby est l'une des fonctionnalités les plus puissantes et distinctives du langage. C'est un morceau de code que vous pouvez associer à un appel de méthode. Le bloc n'est pas exécuté immédiatement ; il est plutôt 'donné' à la méthode, qui peut alors décider de l'exécuter une ou plusieurs fois.

L'analogie la plus simple est celle de la recette. Imaginez que la méthode .each est un chef cuisinier expert. Le chef sait comment prendre chaque ingrédient d'une liste (votre tableau) un par un. Mais il ne sait pas ce que vous voulez en faire. Le bloc de code, c'est la recette que vous lui donnez : 'Pour chaque ingrédient, épluche-le et coupe-le en dés'. Le bloc est une instruction sur mesure que la méthode va exécuter.

Techniquement, un bloc est une sorte de fonction anonyme. 'Anonyme' car il n'a pas de nom, contrairement à une méthode définie avec def. Il n'existe que dans le contexte de l'appel de méthode auquel il est attaché.

Les deux syntaxes d'un bloc : `do...end` et `{...}`

Ruby propose deux manières syntaxiques pour définir un bloc. Elles sont fonctionnellement identiques, et le choix entre les deux est purement une question de convention et de lisibilité.

La première est la syntaxe do...end, qui est privilégiée pour les blocs qui s'étendent sur plusieurs lignes ou qui contiennent une logique complexe. C'est la version la plus lisible pour des actions élaborées.

[1, 2, 3].each do |number|
  puts "Début du tour pour le nombre #{number}"
  puts "Fin du tour"
end

La seconde est la syntaxe avec les accolades {...}. Elle est préférée par la communauté pour les blocs qui ne contiennent qu'une seule ligne de code. Elle rend le code plus compact et direct pour les opérations simples.

[1, 2, 3].each { |number| puts "Le nombre est #{number}" }

Conseil d'expert : La question que vous vous posez sûrement est : y a-t-il une différence de performance ? Absolument aucune. La seule différence réside dans la priorité des opérations dans des cas très avancés. Pour 99.9% des usages, considérez-les comme interchangeables et suivez la convention : do...end pour le multi-lignes, {...} pour le mono-ligne.

Le rôle crucial de la variable de bloc : `|variable|`

Vous avez remarqué la partie |fruit| ou |number| dans nos exemples. C'est ce qu'on appelle la variable de bloc, et elle est fondamentale. C'est le canal de communication entre la méthode et le bloc.

La méthode qui reçoit le bloc (comme .each) est responsable de 'passer' une valeur au bloc à chaque fois qu'elle l'exécute. La variable de bloc est là pour capturer cette valeur et la rendre utilisable à l'intérieur du bloc. Pour .each, à chaque itération sur le tableau, la méthode prend l'élément courant et le 'confie' au bloc via cette variable.

# La méthode .each va appeler ce bloc 3 fois.
# 1. Elle passe "Alice" à la variable |name|
# 2. Elle passe "Bob" à la variable |name|
# 3. Elle passe "Charlie" à la variable |name|
%w[Alice Bob Charlie].each { |name| puts "Bonjour, #{name}!" }

Au-delà de `.each` : un concept omniprésent en Ruby

L'itérateur .each n'est que la pointe de l'iceberg. Le concept de bloc est utilisé partout en Ruby pour créer des APIs élégantes et expressives. En maîtrisant les blocs maintenant, vous vous préparez à comprendre une grande partie de l'écosystème.

Vous les retrouverez dans de nombreuses méthodes de collection pour transformer ou filtrer des données (.map, .select), pour gérer des ressources en toute sécurité (File.open(...) do ... end garantit que le fichier sera fermé), ou pour configurer des bibliothèques.

Comprendre le bloc, ce n'est pas juste apprendre une syntaxe. C'est comprendre une philosophie centrale de Ruby : la capacité de passer non seulement des données, mais aussi des comportements (de la logique) à des méthodes.