irb中的哈希声明语法错误

时间:2013-10-18 06:36:52

标签: ruby

1. { :a => 10 } #=> no error
2. { a: 10 }    #=> no error

3. { :"str" => 10 } #=> no error
4. { "str": 10 }    #=> syntax error, unexpected ':', expecting =>

不是4.和2相同吗?为什么2正在运行而4抛出语法错误?

3 个答案:

答案 0 :(得分:3)

我的理解是{"key": value}不是有效的语法,因为不清楚它是否意味着{:"key" => value}{"key" => value}

对此here进行了讨论。引自Matz的讨论

  

| Iff {'key':'value'}表示{:key => '价值'}我没有异议。

     

|这不会误导吗?我认为OP希望{'key':'value'}表示{'key'=> “值}

     

但考虑到{key:“value”}这一事实   是{:key =>的简写“value”},{“key”:“value”}应该是一个   {:“key”=>的简写“值”}。除此之外,因为它让我想起了   JSON这么多,使得:和“a”:不同可能会导致更多混乱   比上述误导。

          matz.

答案 1 :(得分:2)

Hash:当您的密钥始终为符号时,哈希允许使用其他语法格式。

options = { :font_size => 10, :font_family => "Arial" }

你可以把它写成:

options = { font_size: 10, font_family: "Arial" }

在前三种情况下,所有都是键位置的符号,但第四种是字符串实例,而不是符号实例作为键。这就是第四种情况是无效的Ruby语法的原因。

{ :a => 10 }.keys[0].class # => Symbol
{ a: 10 }.keys[0].class    # => Symbol
{ :"str" => 10 }.keys[0].class # => Symbol

答案 2 :(得分:1)

没有。 (1)是标准符号,(2)是符号键哈希的简写1.9语法,(3)是“str”的缩写.to_sym,(4)不存在,你应该使用hashrocket。