Ruby do/end 与大括号

发布于 2024-10-29 13:49:26 字数 184 浏览 4 评论 0原文

为什么这个映射表达式会根据我使用大括号还是 do/end 产生不同的结果?

a = [1,2,3,4,5]


p a.map { |n|
    n*2
}  
#=> [2,4,6,8,10]


p a.map do |n|
    n*2
end  
#=> [1,2,3,4,5]

Why does this map expression produce different results depending on whether I use braces or do/end?

a = [1,2,3,4,5]


p a.map { |n|
    n*2
}  
#=> [2,4,6,8,10]


p a.map do |n|
    n*2
end  
#=> [1,2,3,4,5]

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

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

发布评论

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

评论(3

ヤ经典坏疍 2024-11-05 13:49:26

这是因为第二行被解释为:

p(a.map) do ... end

而不是:

p(a.map do ... end)

在这种情况下,语法是模棱两可的,而do似乎并不像{那样强烈。

That's because the second line is interpreted as:

p(a.map) do ... end

instead of:

p(a.map do ... end)

The grammar is ambiguous in this case and do doesn't seem to bind as strongly as {.

几味少女 2024-11-05 13:49:26

这与 { 字符和 do 关键字的关联性差异有关。

在第一种情况下,块被解释为 map 函数的块参数。 map 函数的结果是 p 函数的参数。

在第二种情况下,该块被解释为 p 函数的块参数,而 a.map 被解释为 p< /代码> 函数。由于 a.map 的计算结果为 a,因此会打印原始数组。在这种情况下,该块实际上被忽略。

That has to do with the difference in associativity of the { character and the do keyword.

In the first case, the block is interpreted as a block argument to the map function. The result of the map function is the argument to the p function.

In the second case, the block is interpreted as a block argument to the p function, while the a.map is interpreted as the first argument to the p function. Since a.map evaluates to a, this prints the original array. The block is effectively ignored in this case.

七色彩虹 2024-11-05 13:49:26

使用 do/end 语法,您可以将块作为第二个参数传递给 p,而不是传递给映射。您会得到相同的结果:

p a.map

该块被 p 忽略,因为它不会在 inspect 上产生任何内容。

With the do/end syntax you are passing the block to p as a second argument, rather than to the map. You get the same result with:

p a.map

The block is ignored by p as it does not produce anything on inspect.

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