Ruby 块和不带括号的参数

Posted

技术标签:

【中文标题】Ruby 块和不带括号的参数【英文标题】:Ruby block and unparenthesized arguments 【发布时间】:2010-09-30 00:39:18 【问题描述】:

我提取了简单的例子:

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]

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

【问题讨论】:

这是Ruby Block Syntax Error、Code block passed to each works with brackets but not with do-end (ruby)、Block definition - difference between braces and do-end ?、Ruby multiline block without do end、Using do block vs brackets 和 What is the difference or value of these block coding styles in Ruby? 的副本。 本帖日期中使用 Ruby-2.2.0 的部分撬动会话。 pp_hash = x.map 做 |i| :value => i, :double => (i*2) end => [:value=>1, :double=>2, :value=>2, :double=>4, :value=>3, :double=>6] pp_hash.join(",") ":value=>1, :double=>2,:value=>2, :double=>4, :value=>3, :double=>6" 这在今天的 Json 用法中可能更可取,但这只是读取输出的风格问题。有时,只要您的代码可以处理正确的类型,您将传递哪一个并不重要。 pp_hash = pp_hash.join(",") 这是我在切线之前真正得到的。这是 pry 的第一部分.... [53] pry(main)> pp x.map do |i| :key => i, :value => (i*2) end # => # 【参考方案1】:

因为你在打电话

pp x.map

并将块传递给 pp(忽略它)

如Programming Ruby 书中所述

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

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

【讨论】:

谢谢@Gareth,你知道任何正式的参考资料吗?一些语言规范等?

以上是关于Ruby 块和不带括号的参数的主要内容,如果未能解决你的问题,请参考以下文章

js中new创建对象时带括号和不带括号有啥区别

Python调用函数加括号和不加括号的区别

Python调用函数加括号和不加括号的区别

为啥AngularJS货币过滤器格式负数用括号

没有参数的 Scala 方法

ThreadPool.QueueUserWorkItem的用法,带参数和不带参数