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?"

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top