Comprensione del comportamento dell'iniezione utilizzata con una lambda in Ruby
Domanda
Spesso inserisco lambda preconfigurati in metodi enumerabili come 'map', 'select' ecc. ma il comportamento di "iniettare" sembra essere diverso. per esempio. con
mult4 = lambda {|item| item * 4 }
poi
(5..10).map &mult4
mi dà
[20, 24, 28, 32, 36, 40]
Tuttavia, se creo una lambda a 2 parametri da utilizzare con un'iniezione in questo modo,
multL = lambda {|product, n| product * n }
Voglio essere in grado di dire
(5..10).inject(2) &multL
poiché "inject" ha un parametro singolo facoltativo per il valore iniziale, ma questo mi dà ...
irb(main):027:0> (5..10).inject(2) &multL
LocalJumpError: no block given
from (irb):27:in `inject'
from (irb):27
Tuttavia, se inserisco '& amp; multL' in un parametro secondo da iniettare, allora funziona.
irb(main):028:0> (5..10).inject(2, &multL)
=> 302400
La mia domanda è " perché funziona e non il tentativo precedente? "
Soluzione
Quindi la ragione che
(5..10).map &mult4
funziona e
(5..10).inject(2) &multL
non è che nel primo caso i rubens parens siano impliciti, quindi significa davvero
(5..10).map(&mult4)
se lo desideri, per il secondo caso puoi usare
(5..10).inject 2, &multL
Il trucco esterno alle parentesi funziona solo per passare i blocchi a un metodo, non agli oggetti lambda.