理解在Ruby中使用lambda注入的行为

我经常将预配置的lambdas插入可枚举的方法,如’map’,’select’等,但’inject’的行为似乎有所不同。 例如

mult4 = lambda {|item| item * 4 } 

然后

 (5..10).map &mult4 

给我

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

但是,如果我使用2参数lambda与这样的注入一起使用,

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

我希望能说

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

因为’inject’有一个可选的单个参数作为初始值,但这给了我…

 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 

我的问题是“为什么这样做而不是之前的尝试?”

所以原因

 (5..10).map &mult4 

工作和

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

并不是第一种情况下隐含的rubyparens,所以它的确意味着

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

如果你愿意,可以使用第二种情况

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

parens技巧的外部仅适用于将块传递给方法,而不是lambda对象。