2008-09-19 24 views
5

我經常將預配置的lambda插入到像'map','select'等可枚舉方法中。但是'inject'的行爲似乎有所不同。 例如與瞭解在Ruby中使用lambda時注入的行爲

mult4 = lambda {|item| item * 4 } 

然後

(5..10).map &mult4 

給我

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

但是,如果我做一個2參數拉姆達與像這樣的注射使用,

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

我想能夠說

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

因爲「注入」的初始值, 可選參數,但也練就了我......

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

但是,如果我的東西了「& multL」成參數注入,然後它的工作。

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

我的問題是「爲什麼這個工作,而不是以前的嘗試?」

回答

10

這樣

(5..10).map &mult4 

作品和

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

不就是紅寶石括號是在第一種情況下隱含的,所以它的真正含義

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

如果原因你想要的,你可以使用第二種情況

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

parens技巧的外部只適用於將塊傳遞給方法,而不是lambda對象。