我试图在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}
第一种情况下的问题是什么?
答案 0 :(得分:4)
大括号可以表示块文字或Hash
文字。在这种情况下,它被解释为块文字,x: 1
不是语法上有效的Ruby表达式。
您可以使用括号提供参数列表以解决此歧义:
puts({x: 1})
或者,如果方法的最后一个参数是Hash
,Ruby允许你省略花括号:
puts(x: 1)
在这种情况下,您可以再次省略括号,因为没有与块混淆:
puts x: 1
您的上一个示例有效,因为逗号告诉解析器参数列表尚未完成,后面的内容可能不是块。
答案 1 :(得分:1)
在第一种情况下,{}
被解析为块。在第二个中,它被解析为散列。
示例:
def foo(opts = nil, &block)
p opts
p block
end
foo { 'a' } #=> nil #<Proc:0x007f12144f7f68@(pry):12>
foo({a: 'a'}) #=> {:a=>"a"} nil
foo a: 'a' #=> {:a=>"a"} nil
答案 2 :(得分:0)
Ruby认为你传递的是阻止。要传递哈希,请尝试:
puts({x: 1})
或
puts(x: 1)