2008-09-19 9 views
5

A menudo enchufo lambdas preconfiguradas en métodos enumerables como 'mapa', 'seleccionar', etc. pero el comportamiento de 'inyectar' parece ser diferente. p. conComprender el comportamiento de la inyección utilizada con una lambda en Ruby

mult4 = lambda {|item| item * 4 } 

continuación

(5..10).map &mult4 

me da

[20, 24, 28, 32, 36, 40] 

Sin embargo, si hago una lambda de 2 parámetros para su uso con una inyección como tal,

multL = lambda {|product, n| product * n } 

Quiero poder decir

(5..10).inject(2) &multL 

desde 'inyectar' tiene una sola opcional 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 yo meto la '& multL' en un segundo parámetro para inyectar, luego funciona.

irb(main):028:0> (5..10).inject(2, &multL) 
=> 302400 

Mi pregunta es "¿por qué funciona eso y no es el intento anterior?"

Respuesta

10

Así que la razón por la que

(5..10).map &mult4 

obras y

(5..10).inject(2) &multL 

no es que los parens rubí están implícitos en el primer caso, por lo que realmente significa

(5..10).map(&mult4) 

si usted quería, para el segundo caso podría usar

(5..10).inject 2, &multL 

El truco exterior de pareners solo funciona para pasar bloques a un método, no a objetos lambda.

Cuestiones relacionadas