了解在Ruby中与lambda一起使用的注入行为

时间:2020-03-06 14:26:07  来源:igfitidea点击:

我经常将预先配置的lambda插入到" 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

由于"注入"的初始值具有可选的单个参数,
但这给了我...

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

并不是说在第一种情况下,ruby parens是隐式的,所以这确实意味着

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

如果需要,可以在第二种情况下使用

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

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