为什么在Ruby中向数组中推送哈希必须使用括号?

3
我想使用 Ruby 1.8.7 将哈希添加到数组中:
items = Array.new
items.push {:a => "b", :c => "d"}

上述语句将返回类似于以下错误:

SyntaxError: compile error
(irb):35: syntax error, unexpected tASSOC, expecting '}'
items.push {:a => "b", :c => "d"}
                 ^
(irb):35: syntax error, unexpected ',', expecting '}'
items.push {:a => "b", :b => "c"}
                      ^

我发现解决方案是将push参数括在括号( )中,或者我可以使用<<操作符。 我也知道push接受一个或多个参数,而<<仅从这个答案中接受单个参数,但让我困扰的是为什么需要使用括号,而我们都知道Ruby中的括号是可选的呢?

1个回答

7

我的猜测是由于Ruby试图将哈希解析为块,期望是代码而不是哈希键和值。这类似于:

items.push() do
  :a => "b", :b => "c"
end

这不是有效的语法。


奇怪的是,items.push :a => "b", :c => "d" 的效果正如预期... - Patrick Oscity
1
@padde 这是因为缺少花括号 {},所以 Ruby 不会将其错误地解析为块。相反,它会正确地解析为方法调用 push(:a => "b", :c => "d")。最初的问题是由于您有一个模棱两可的情况,Ruby 编译器需要“猜测”您的意思(块或方法参数)。因为计算机不太擅长读取您的想法,所以它会抛出错误。 - Casper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接