Ruby 块和无括号的参数

发布于 2024-07-11 03:26:28 字数 535 浏览 10 评论 0原文

我提取了简单的例子:

require 'pp'
x = 1..3
pp x.map do |i| {:value => i, :double => (i*2)} end
pp x.map { |i| {:value => i, :double => (i*2)} }

pp(x.map do |i| {:value => i, :double => (i*2)} end)
pp(x.map { |i| {:value => i, :double => (i*2)} })

我想知道为什么第一个 pp 会产生:

[1, 2, 3]

虽然所有订单都给出:

[{:value=>1, :double=>2}, {:value=>2, :double=>4}, {:value=>3, :double=>6}]

我认为它与运算符优先级有关。 我在哪里可以找到好的解释?

I extracted simple example:

require 'pp'
x = 1..3
pp x.map do |i| {:value => i, :double => (i*2)} end
pp x.map { |i| {:value => i, :double => (i*2)} }

pp(x.map do |i| {:value => i, :double => (i*2)} end)
pp(x.map { |i| {:value => i, :double => (i*2)} })

I am wondering why first pp produces:

[1, 2, 3]

While all the oders are giving:

[{:value=>1, :double=>2}, {:value=>2, :double=>4}, {:value=>3, :double=>6}]

I assume it has something to do with operator precedence. Where can I find good explanation?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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

评论(1

一枫情书 2024-07-18 03:26:28

这是因为您正在调用

pp x.map

并向 pp 传递一个块(它会忽略它),

Programming Ruby 中所述

大括号具有高优先级; do 的优先级较低

,因此,实际上,大括号绑定到最接近它们的函数调用 (x.map),而 do 绑定到最远的函数调用 (pp)。 这有点简单,但应该可以解释这种情况

It's because you're calling

pp x.map

and passing a block to pp (which ignores it)

As explained in the Programming Ruby book

Braces have a high precedence; do has a low precedence

So, effectively, braces tie to the function call closest to them (x.map) whereas do binds to the furthest away (pp). That's a bit simplistic but it should explain this situation

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