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 抛出语法错误?
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 抛出语法错误?
我的理解是这{"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.
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
不。(1) 是标准符号,(2) 是符号键哈希的简写 1.9 语法,(3) 是“str”.to_sym 的简写,(4) 不存在,您应该使用 hashrocket。