Comprender el comportamiento de inyección utilizado con una lambda en Ruby
Pregunta
A menudo conecto lambdas preconfiguradas en métodos enumerables como 'mapa', 'seleccionar', etc.pero el comportamiento de 'inyectar' parece ser diferente.p.ej.con
mult4 = lambda {|item| item * 4 }
entonces
(5..10).map &mult4
me da
[20, 24, 28, 32, 36, 40]
Sin embargo, si hago una lambda de 2 parámetros para usar con una inyección como esta,
multL = lambda {|product, n| product * n }
quiero poder decir
(5..10).inject(2) &multL
ya que 'inject' tiene una opción opcional soltero Parámetro para el valor inicial, pero eso me da ...
irb(main):027:0> (5..10).inject(2) &multL
LocalJumpError: no block given
from (irb):27:in `inject'
from (irb):27
Sin embargo, si meto el '&multL' en un segundo parámetro a inyectar, entonces funciona.
irb(main):028:0> (5..10).inject(2, &multL)
=> 302400
Mi pregunta es "¿por qué funciona eso y no el intento anterior?"
Solución
Entonces la razón por la que
(5..10).map &mult4
obras y
(5..10).inject(2) &multL
lo que no es que los pares Ruby están implícitos en el primer caso, por lo que realmente significa
(5..10).map(&mult4)
si quisieras, para el segundo caso podrías usar
(5..10).inject 2, &multL
El truco externo a los pares solo funciona para pasar bloques a un método, no a objetos lambda.