2013-12-08 211 views
0

我试图运行在IRB会议上就这简单的代码,但我得到这个错误:奇怪的语法错误?

[9] pry(main)> puts {x: 1} 
SyntaxError: unexpected ':', expecting '}' 
puts {x: 1} 
     ^

我知道,我可以运行相同的代码是这样的:

[12] pry(main)> y = {x: 1} 
=> {:x=>1} 
[13] pry(main)> puts y 
{:x=>1} 

或:

[14] pry(main)> puts "",{x: 1} 
{:x=>1} 

第一种情况是什么问题?

回答

4

大括号可以表示任一一个块文字或文字Hash。在这种情况下,它被解释为块文字,并且x: 1不是语法上有效的Ruby表达式。

可以为用户提供括号内的参数列表来解决这种不确定性:

puts({x: 1}) 

或者,红宝石让你离开了大括号,如果最后一个参数的方法是Hash

puts(x: 1) 

而且在这种情况下,您可以再次离开了括号,因为没有混淆块:

puts x: 1 

您的最后一个示例工作,因为逗号告诉解析器参数列表尚未完成,接下来不可能是一个块。

+1

Humm。是啊!这正是这个原因..我跟错了解释..我需要休息! :)) –

1

在第一种情况下,{}被解析为一个块。在第二个它被解析为一个散列。

例子:

def foo(opts = nil, &block) 
    p opts 
    p block 
end 

foo { 'a' } #=> nil #<Proc:[email protected](pry):12> 
foo({a: 'a'}) #=> {:a=>"a"} nil 
foo a: 'a' #=> {:a=>"a"} nil 
0

红宝石认为你传递一个。用于通过一个散列尝试:

puts({x: 1}) 

puts(x: 1)