奇怪的语法错误?

时间:2013-12-08 12:50:38

标签: ruby-on-rails ruby syntax

我试图在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}

第一种情况下的问题是什么?

3 个答案:

答案 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)