5

我经常将预先配置的 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

我的问题是“为什么这行得通,而不是之前的尝试?”

4

1 回答 1

11

所以原因

(5..10).map &mult4

作品和

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

不是红宝石括号在第一种情况下是隐含的,所以它真的意味着

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

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

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

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

于 2008-09-19T14:22:38.290 回答