2008-09-19 8 views
5

Często podłączam wstępnie skonfigurowane lambdy do różnych metod, takich jak 'map', 'select' itp. , ale zachowanie 'inject' wydaje się być inne. np. zOpis działania wtryskiwacza używanego z lambda w Ruby

mult4 = lambda {|item| item * 4 } 

następnie

(5..10).map &mult4 

daje mi

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

Jednakże, jeśli zrobię lambda 2-parametrów do stosowania z inject jak tak,

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

Chcę móc powiedzieć:

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

ponieważ „wstrzykują” ma opcjonalny pojedynczy parametr do wartości początkowej, ale to daje mi ...

irb(main):027:0> (5..10).inject(2) &multL 
LocalJumpError: no block given 
     from (irb):27:in `inject' 
     from (irb):27 

Jednak gdybym nadziać „& multL” do drugi parametr do wstrzyknięcia, a następnie działa.

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

Moje pytanie brzmi "dlaczego to działa, a nie poprzednia próba?"

Odpowiedz

10

więc powodem, że

(5..10).map &mult4 

prace i

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

nie jest to, że nawiasy ruby ​​są ukryte w pierwszym przypadku, tak naprawdę oznacza

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

if chciałeś, dla drugiego przypadku możesz użyć

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

Zewnętrzna sztuczka parens działa tylko przy przekazywaniu bloków do metody, a nie obiektom lambda.

Powiązane problemy