Mik*_*row 5 ruby lambda inject
我经常将预配置的lambdas插入可枚举的方法,如'map','select'等,但'inject'的行为似乎有所不同.例如
mult4 = lambda {|item| item * 4 }
Run Code Online (Sandbox Code Playgroud)
然后
(5..10).map &mult4
Run Code Online (Sandbox Code Playgroud)
给我
[20, 24, 28, 32, 36, 40]
Run Code Online (Sandbox Code Playgroud)
但是,如果我将一个2参数lambda用于这样的注入,
multL = lambda {|product, n| product * n }
Run Code Online (Sandbox Code Playgroud)
我希望能够说出来
(5..10).inject(2) &multL
Run Code Online (Sandbox Code Playgroud)
因为'inject'有一个可选的单个参数作为初始值,但这给了我...
irb(main):027:0> (5..10).inject(2) &multL
LocalJumpError: no block given
from (irb):27:in `inject'
from (irb):27
Run Code Online (Sandbox Code Playgroud)
但是,如果我将'&multL'填充到第二个参数中以进行注入,那么它可以工作.
irb(main):028:0> (5..10).inject(2, &multL)
=> 302400
Run Code Online (Sandbox Code Playgroud)
我的问题是"为什么这样做而不是之前的尝试?"
ram*_*ion 11
所以原因
(5..10).map &mult4
Run Code Online (Sandbox Code Playgroud)
工作和
(5..10).inject(2) &multL
Run Code Online (Sandbox Code Playgroud)
并不是第一种情况下隐含的红宝石parens,所以它的确意味着
(5..10).map(&mult4)
Run Code Online (Sandbox Code Playgroud)
如果你愿意,对于你可以使用的第二种情况
(5..10).inject 2, &multL
Run Code Online (Sandbox Code Playgroud)
parens技巧的外部仅适用于将块传递给方法,而不是lambda对象.
| 归档时间: |
|
| 查看次数: |
1880 次 |
| 最近记录: |