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 toeach
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 #因为你在打电话
pp x.map
并将块传递给 pp(忽略它)
如Programming Ruby 书中所述
大括号具有高优先级; do 优先级低
因此,有效地,大括号绑定到离它们最近的函数调用(x.map),而 do 绑定到最远的函数调用(pp)。这有点简单,但应该可以解释这种情况
【讨论】:
谢谢@Gareth,你知道任何正式的参考资料吗?一些语言规范等?以上是关于Ruby 块和不带括号的参数的主要内容,如果未能解决你的问题,请参考以下文章