2012-07-03 32 views
2

我想使用Ruby版本1.8.7哈希添加到一个数组:为什么在Ruby中将哈希推入数组必须使用括号?

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接受一个或多个参数,并且<<只接受来自this answer的单个参数,但是困扰我的是为什么我需要使用括号,而我们都知道Ruby中的括号是可选的?

回答

6

我的猜测是,这是因为ruby试图解析哈希作为一个块,期待代码而不是散列键和值。这是类似于:

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

这不是有效的语法。

+0

奇怪的是,'items.push:a =>“b”,:c =>“d”'正如预期的那样工作...... –

+1

@padde这是因为大括号'{}'丢失了,所以ruby不会使将其解析为块的错误。相反,它会以方法调用'push(:a =>“b”,:c =>“d”)'正确解析。原来的问题是因为你有一个模棱两可的情况,ruby编译器需要“猜测”你的含义(块或方法参数)。因为电脑不擅长阅读你的想法,所以它会抛出一个错误。 – Casper

+0

很好的解释,感谢启发。 :) –

相关问题