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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top