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

时间:2008-09-19 14:16:41

标签: ruby lambda inject

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

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'填入 second 参数进行注入,那么它就可以了。

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

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

1 个答案:

答案 0 :(得分:11)

所以

的原因
(5..10).map &mult4

有效,

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

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

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

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

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

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