了解 Ruby 中与 lambda 一起使用的注入行为
我经常将预先配置的 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
我的问题是“为什么这个有效,而不是之前的尝试?”
I often plug pre-configured lambdas into enumerable methods like 'map', 'select' etc.
but the behavior of 'inject' seems to be different.
e.g. with
mult4 = lambda {|item| item * 4 }
then
(5..10).map &mult4
gives me
[20, 24, 28, 32, 36, 40]
However, if I make a 2-parameter lambda for use with an inject like so,
multL = lambda {|product, n| product * n }
I want to be able to say
(5..10).inject(2) &multL
since 'inject' has an optional single parameter for the initial value,
but that gives me ...
irb(main):027:0> (5..10).inject(2) &multL
LocalJumpError: no block given
from (irb):27:in `inject'
from (irb):27
However, if I stuff the '&multL' into a second parameter to inject, then it works.
irb(main):028:0> (5..10).inject(2, &multL)
=> 302400
My question is "why does that work and not the previous attempt?"
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
原因
因此,起作用和
不起作用的
是 ruby 括号在第一种情况下是隐式的,所以这实际上意味着如果您愿意,对于第二种情况,您可以使用
括号外面的技巧仅适用于将块传递给方法,而不适用拉姆达对象。
So the reason that
works and
doesn't is that ruby parens are implicit in the first case, so it really means
if you wanted, for the second case you could use
The outside the parens trick only works for passing blocks to a method, not lambda objects.