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

发布于 2024-07-04 18:10:57 字数 840 浏览 7 评论 0原文

我经常将预先配置的 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

风启觞 2024-07-11 18:10:57

原因

(5..10).map &mult4

因此,起作用和

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

不起作用的

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

是 ruby​​ 括号在第一种情况下是隐式的,所以这实际上意味着如果您愿意,对于第二种情况,您可以使用

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

括号外面的技巧仅适用于将块传递给方法,而不适用拉姆达对象。

So the reason that

(5..10).map &mult4

works and

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

doesn't is that ruby parens are implicit in the first case, so it really means

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

if you wanted, for the second case you could use

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

The outside the parens trick only works for passing blocks to a method, not lambda objects.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文