Comprendre le comportement d’inject utilisé avec un lambda en Ruby
Question
Je branche souvent des lambdas préconfigurés dans des méthodes énumérables telles que "map", "select", etc. mais le comportement de "injecter" semble être différent. par exemple. avec
mult4 = lambda {|item| item * 4 }
puis
(5..10).map &mult4
me donne
[20, 24, 28, 32, 36, 40]
Cependant, si je fabrique un lambda à 2 paramètres à utiliser avec une injection similaire,
multL = lambda {|product, n| product * n }
Je veux pouvoir dire
(5..10).inject(2) &multL
puisque "inject" a un paramètre facultatif single pour la valeur initiale, mais ça me donne ...
irb(main):027:0> (5..10).inject(2) &multL
LocalJumpError: no block given
from (irb):27:in `inject'
from (irb):27
Cependant, si je mets le paramètre '& amp; multL' dans un paramètre seconde à injecter, cela fonctionne.
irb(main):028:0> (5..10).inject(2, &multL)
=> 302400
Ma question est "Pourquoi cela fonctionne-t-il et non la tentative précédente?"
La solution
Donc, la raison pour laquelle
(5..10).map &mult4
fonctionne et
(5..10).inject(2) &multL
ne pas est que les parens de rubis sont implicites dans le premier cas, donc cela signifie vraiment
(5..10).map(&mult4)
si vous voulez, vous pouvez utiliser le second cas
(5..10).inject 2, &multL
L'astuce extérieure de parens ne fonctionne que pour passer des blocs à une méthode, pas des objets lambda.