Compreendendo o comportamento de injectar usado com um lambda em Ruby
Pergunta
Muitas vezes eu ligar lambdas pré-configurados em métodos enumeráveis ??como 'mapa', 'selecionar' etc. mas o comportamento de 'injetar' parece ser diferente. por exemplo. com
mult4 = lambda {|item| item * 4 }
então
(5..10).map &mult4
me dá
[20, 24, 28, 32, 36, 40]
No entanto, se eu fizer uma lambda 2 parâmetros para uso com uma injeção como assim,
multL = lambda {|product, n| product * n }
Eu quero ser capaz de dizer
(5..10).inject(2) &multL
desde 'injetar' tem um opcional parâmetro único para o valor inicial, mas que me dá ...
irb(main):027:0> (5..10).inject(2) &multL
LocalJumpError: no block given
from (irb):27:in `inject'
from (irb):27
No entanto, se eu encher o '& multL' em um segunda parâmetro para injetar, então ele funciona.
irb(main):028:0> (5..10).inject(2, &multL)
=> 302400
A minha pergunta é "porquê é que isso funciona e não a tentativa anterior?"
Solução
Assim, a razão pela qual
(5..10).map &mult4
obras e
(5..10).inject(2) &multL
não é que parens rubi estão implícitos no primeiro caso, para que ele realmente significa
(5..10).map(&mult4)
Se você queria, para o segundo caso, você poderia usar
(5..10).inject 2, &multL
O fora os parênteses truque só funciona para a passagem de blocos para um método, não objetos lambda.