Le Blog du Geek Joyeux

Plus moins vite tu codes, moins plus vite ça plante

La méthode inject en Ruby

| Commentaires

En Ruby, il existe une méthode bien pratique nommée inject.

Elle s’utilise de la manière suivante :

1
2
3
4
puts (0..10).inject(0) do |somme, x|
  somme += x
end
# => 55

Dans l’exemple précédent, on part d’une valeur de 0 que l’on modifie à chaque tour. Le code suivant est équivalent :

1
2
3
4
5
6
somme = 0
(0..10).each do |x|
  somme += x
end
puts somme
# => 55

De manière classique, on peut s’en servire pour générer un tableau ou une table de hash de la manière suivante :

1
2
3
4
@articles.inject({}) do |hash, article|
  hash[article.title] = article.body
  hash
end

EDIT: Dans ce cas précis, il est préférable d’utiliser la méthode each_with_object comme ceci :

1
2
3
@articles.each_with_object({}) do |article, hash|
  hash[article.title] = article.body
end

Une autre utilisation interessante, est avec les booléens :

1
2
3
@plugins.inject(true) do |keep_going, plugin|
  keep_going &= plugin.some_method
end

On obtient donc en fin de parcours, true si tous les appels ont retourné true ou false si au moins un appel a retourné false.

Dans le cas où on veut stoper l’appel à inject dés qu’un appel retourne false, on peut utiliser l’instruction break :

1
2
3
@plugins.inject(true) do |keep_going, plugin|
  keep_going &= plugin.some_method or break(keep_going)
end

Cela permet de ne pas faire les appels suivants dés le premier retour négatif.

Commentaires