{ 'symbol name': "some value" } 是有效的 Ruby 2 哈希语法吗?

Is { 'symbol name': "some value" } valid Ruby 2 syntax for Hashes?

TL;DR — 问题

{ 'symbol name': 5 }{ "symbol name": 5 } 是否有效且定义明确 Ruby 2 哈希语法?

6 种哈希符号,其中 2 种未知

在Ruby2中,以下Hash字面量表示法是等价的:

{ :my_key => 5 }
{ my_key: 5 }
{ :'my_key' => 5 }
{ :"my_key" => 5 }
  1. 第一行是通用的哈希文字表示法(也适用于非符号键),键使用默认的符号文字表示法。
  2. 第二行是 Ruby 2 为以符号为键的哈希引入的新的简写符号。
  3. 第三行又是通用的哈希文字表示法,键的替代符号文字表示法。 (如果您需要在符号名称中包含空格或其他花哨的字符,则此替代符号文字表示法非常方便。)
  4. 第四行是上面的细微变化,它也允许在符号名称中进行字符串插值。

前两个符号是documented on the Core API page for Hash. The fourth notation is just plugging in an alternate Symbol literal notation (which is documented in the Core API page for Symbol)第一个哈希符号,所以对于哈希文字来说它并不是真正不同的符号。 third 符号也是如此。 Symbol 核心 API 页面上没有提到单引号字符串符号文字符号并没有让我太在意,因为它似乎像我期望的那样工作。

但最近我注意到以下符号也有效,并且也等同于上面的符号:

{ "my_key": 5 }
{ 'my_key': 5 }

虽然它有点一致(并且像我预期的那样工作,但我希望它完全有效)并且可能有用,但我发现它非常出色以至于有点惊讶。我找不到关于此语法的任何文档,并且此语法不仅仅是通过将已记录的符号插入其他已记录的符号(如上面的第三和第四个符号)来构建的。 (它更像是 'merging' 第二个带有第三个或第四个符号。)因此我想知道:

这只是我的 Ruby 解释器吗 (MRI ruby 2.2.1p85 (2015-02-26 revision 49769) [x86_64-linux]) 对未定义的语法很好,或者这是我可以从任何符合的 Ruby 2 实现中期望的行为?

(不确定这个问题是否有意义,如果是as Brian Shirai claims那么"Ruby Is What [MRI] Does"。)

如果你只关心双引号和单引号,为什么不也这样做

{'my_key': 'my value' } 并在您的列表中添加另一种构建哈希的方法?

{ :my_key => "my value" } 
{ my_key: "my value" }
{ :'my_key' => "my value" }
{ :"my_key" => "my value" }

None 以上行使用了 2.x-only 语法。它们都是有效的 1.9 语法。 (See demonstration.)

{ "my_key": "my value" }
{ 'my_key': "my value" }

那是 feature request #4276 which landed in 2.2。这意味着它在 2.1 甚至更旧版本中是无效语法。这也意味着声称实现 2.2 的实现必须支持它。