【问题标题】:Is { 'symbol name': "some value" } valid Ruby 2 syntax for Hashes?{ 'symbol name': "some value" } 是有效的 Ruby 2 哈希语法吗?
【发布时间】:2015-10-07 14:46:57
【问题描述】:

TL;DR — 问题

{ '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. 第一行是通用哈希文字表示法(也适用于非符号键),键的默认符号文字表示法。
  2. 第二行是 Ruby 2 Ruby 1.9 引入的新的速记符号,用于以符号为键的哈希。
  3. 第三行同样是通用的 Hash 文字表示法,键的另一种 Symbol 文字表示法。 (如果您需要在符号名称中包含空格或其他花哨的字符,则此替代符号文字符号很方便。)
  4. 第四行与上述稍有不同,它还允许在符号名称中插入字符串。

前两个符号是documented on the Core API page for Hashfourth 表示法只是在第一个 Hash 表示法中插入了一个替代的 Symbol 文字表示法(即documented in the Core API page for Symbol),因此它实际上并不是 Hash 文字的不同表示法。 third 符号也是如此。 Symbol Core 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] 所做的”。)

【问题讨论】:

  • 该语法在 Ruby 2 中可用
  • @jollarvia:你的意思是 2.2、2.0 和 2.1 看到 {'s': v } 是一个语法错误。
  • 您可以考虑自己将这种新语法的示例添加到文档中。 documenting-ruby.org 是一个有用的资源。
  • 因为它与我的问题无关,因为引入了类似 JavaScript 的语法(在问题中称为“第二表示法”)的版本,我根据 cremno's answer 已经 corrected the version number

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


【解决方案1】:
{ :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 的实现必须支持它。

【讨论】:

    【解决方案2】:

    如果你都是关于双引号和单引号,为什么不也这样做

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

    【讨论】:

    • 我的问题确实可以只提及 either 第三个 ({:'key' =>5}) 第四个 (`{:"key"= >5}) 语法。我只是为了完整性而提到了两者。我和我的问题都不是“关于双引号和单引号”。而是关于哈希文字语法,尤其是关于它们的关键文字。因此,为什么我没有改变值文字。
    • 我已经 changed the examples in the question 使用整数而不是字符串作为哈希值,因此这些值只有一种文字表示法。
    • 知道了。这是有效的语法。但在 {'symbol name': '5'} 中,'5' 的类将是 String;在 {'symbol name': 5} 中,5 的类将是 Fixnum。
    猜你喜欢
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多