0
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 抛出语法错误?

4

3 回答 3

3

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

这里有一个讨论。在讨论中引用 Matz

| iff {'key': 'value'} 的意思是 {:key => 'value'} 我没有异议。

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

但考虑到 {key: "value"} 是 {:key => "value"} 的简写,{"key": "value"} 应该是 {:"key" => "value" 的简写}。除此之外,因为它让我想起了 JSON,所以制作 a: 和 "a": 不同可能会导致比上述误导更多的混乱。

          matz.
于 2013-10-18T06:54:45.340 回答
2

Hash:当您的键始终是符号时,哈希允许另一种语法形式。

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

你可以把它写成:

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

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

{ :a => 10 }.keys[0].class # => Symbol
{ a: 10 }.keys[0].class    # => Symbol
{ :"str" => 10 }.keys[0].class # => Symbol
于 2013-10-18T06:38:41.513 回答
1

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

于 2013-10-18T06:39:20.687 回答