是''符号名称':“某些值”} Hashes的有效Ruby 2语法吗?

时间:2015-07-17 19:25:37

标签: ruby language-lawyer ruby-2.0 ruby-2.1 ruby-2.2

TL; DR - 问题

Hashes有{ 'symbol name': 5 }{ "symbol name": 5 }有效且定义明确的Ruby 2语法吗?

哈希的6个符号,其中2个未知

在Ruby 2中,以下Hash文字符号是等效的:

{ :my_key => 5 }
{ my_key: 5 }
{ :'my_key' => 5 }
{ :"my_key" => 5 }
  1. 第一行是通用Hash文字符号(也适用于非符号键),使用键的默认符号文字表示法。
  2. 第二行是 Ruby 2 Ruby 1.9为Hashes with Symbols作为键引入的新的简写符号。
  3. 第三行也是通用的Hash文字符号,键的替代符号文字表示法。 (如果您需要在符号名称中包含空格或其他精美字符,则此备用符号文字符号很方便。)
  4. 第四行是上面的略微变化,也允许在符号名称中进行字符串插值。
  5. 前两个符号为documented on the Core API page for Hash第四个表示法只是将备用符号文字表示法(documented in the Core API page for Symbol)插入到第一个哈希表示法中,因此它对于哈希文字并不是一个不同的表示法。 第三表示法也是如此。在Symbol核心API页面上没有提到单引号字符串符号文字表示法并没有给我带来太多麻烦,因为它似乎像我期望的那样工作。

    但最近我注意到以下符号也有效,并且也与上述符号相同:

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

    虽然它有点一致(并且像我预期的那样工作,如果我预期这一点有效)并且可能有用,我发现这非常值得惊讶。我找不到关于这种语法的任何文档,并且这种语法不仅仅是通过将记录的符号插入其他记录的符号(如上面的第三和第四种符号)来构建的。 (这更像是将第二种与第三种或第四种符号“合并”。)因此我想知道:

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

    (不确定这个问题是否有意义,如果as Brian Shirai claims“Ruby是什么[MRI]做什么”。)

2 个答案:

答案 0 :(得分:7)

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

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

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

feature request #4276落在2.2。这意味着它在2.1或更旧的版本中是无效的语法。这也意味着声称实施2.2的实现必须支持它。

答案 1 :(得分:0)

如果你是双引号和单引号,为什么不呢?

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