Hashes有{ 'symbol name': 5 }
和{ "symbol name": 5 }
有效且定义明确的Ruby 2语法吗?
在Ruby 2中,以下Hash文字符号是等效的:
{ :my_key => 5 }
{ my_key: 5 }
{ :'my_key' => 5 }
{ :"my_key" => 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]做什么”。)
答案 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' }
并添加另一种为列表构建哈希的方法?