【问题标题】:Why is this string key in a hash converted to a symbol?为什么哈希中的这个字符串键被转换为符号?
【发布时间】:2016-07-30 13:36:27
【问题描述】:

使用 Ruby 2.3:

在示例 1 中,字符串键 "a" 自动转换为符号,而在示例 2 中,它保持为字符串。

示例 1

{"a": 1}
# => {:a=>1} 

示例 2

{"a"=>"c"}
# => {"a"=>"c"}

我认为: 与旧式哈希火箭=> 语法相同。到底是怎么回事?为什么我从未在 Rails 中注意到这一点?是 HashWithIndifferentAccess 掩盖了这一点吗?

【问题讨论】:

  • @Zabba 为什么需要添加那个版本?它仅适用于最近的 Ruby。如果 OP 说它有效,则意味着它是最新版本。
  • OP 在问题中提到了该版本,因此删除它是不合适的,因为删除它会改变问题的含义和意图,所以在这里只是原创。
  • 不是字符串键,是符号键。没有任何改变。

标签: ruby string hash symbols literals


【解决方案1】:

在 Ruby 2.3(.0) 中,这些都是一样的:

{:"a" => 1}
{"a": 1},
{:a => 1}
{a: 1} 

它们都翻译成同一个东西:a 在所有这些情况下都是一个符号。

{"a"=>1} 不同:a 在这种情况下是一个字符串。

【讨论】:

    【解决方案2】:

    这是因为 ruby​​ 1.9 引入了新的哈希语法。带有冒号的语法仅适用于符号键。它被称为“对象的符号”哈希,它只是最常见的哈希样式的语法糖。对我来说还有一点,它更接近 javascript 对象表示法。

    如果我有混合键类型,那么我更喜欢旧样式(散列火箭语法),但这取决于你。混合这两种风格在我看来很难看。

    【讨论】:

    • 这不是 ruby​​ 1.9 中引入的语法。
    • @sawa 新语法是在 ruby​​ 1.9 中引入的,它更接近于 javascript 表示法。
    • 我还可以在这里补充一点,{"a": 1} 表示法 看起来 与 JSON 完全一样,但行为却不像它。在 ruby​​ 中,我们有符号,"a": 转换为 Ruby 符号(不是字符串);在 Javascript 中我们没有符号,所以在 {"a":1} 的 JSON 版本中,“a”是一个字符串。因此,尽管有问题的 Ruby 哈希表示法看起来像 JSON,但从技术上讲并不相同。
    • @sawa 我不需要比你知道的更多。我只知道基础
    • @Reyko,如果你想知道,sawa 的 LOL 有点像 this
    【解决方案3】:

    根据Ruby documentation

    Blockquote Symbol 对象表示 Ruby 解释器中的名称和一些字符串。它们是使用 :name 和 :"string" 文字语法以及各种 to_sym 方法生成的。 [...]

    这意味着运行:

    $ ruby -e ruby -e "h = {key: \"value\"}; puts h"
    $ ruby -e ruby -e "h = {:key => \"value\"}; puts h"
    $ ruby -e ruby -e "h = {\"key\": \"value\"}; puts h"
    $ ruby -e ruby -e "h = {:\"key\" => \"value\"}; puts h"
    $ ruby -e ruby -e "h = {\"#{:key}\": \"value\"}; puts h"
    

    会产生同样的结果:

    $ {:key=>"value"}
    

    【讨论】:

      猜你喜欢
      • 2012-10-14
      • 2020-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 2017-01-07
      • 2011-05-19
      相关资源
      最近更新 更多