【问题标题】:What's the difference `{'x'=> 3}` and `{x: 3}`?`{'x'=> 3}` 和 `{x: 3}` 有什么区别?
【发布时间】:2016-07-23 11:26:15
【问题描述】:

我有这个:

a = {'x' => 3}
b = {'x': 3}
c = {x: 3}
d = {:x => 3}
e = {:'x' => 3}

所以,我有 b = c = d = e = {:x => 3},同时有 a = {"x" => 3}a.class == b.class

我不明白a 和其他变量之间有什么区别。

【问题讨论】:

标签: ruby


【解决方案1】:

bcde 中,密钥是Symbol

a 中,密钥是String

a = { 'x' => 3 }  #=> { "x" => 3 } 
b = { 'x': 3 }    #=> { :x => 3 }
c = { x: 3 }      #=> { :x => 3 }
d = { :x => 3 }   #=> { :x => 3 }
e = { :'x' => 3 } #=> { :x => 3 }

【讨论】:

    【解决方案2】:

    您的变量 a 哈希将 "x" 键作为字符串,而其他变量将该键作为符号。

    在 Ruby 中对对象调用 class 会返回其类,在您的示例中是 Hash。也就是说,所有hash实例的构造函数,比如{x: 3}都是Hash对象。

    【讨论】:

      【解决方案3】:

      ruby 中StringSymbol 类之间存在显着差异:

      按照惯例,除了第一个哈希符号之外,所有的哈希符号都将密钥转换为 Symbol 实例,而第一个哈希符号按原样使用密钥(在这种特殊情况下为 String 实例)。 (更准确地说:bc 将密钥投射到 Symbol 实例,de 不投射任何内容,但在这些情况下给出的密钥已经是 Symbol 实例。)

      由于('x' == :x) == falsea 哈希与后者不同。

      【讨论】:

        猜你喜欢
        • 2019-09-11
        • 1970-01-01
        • 2016-11-30
        • 1970-01-01
        • 1970-01-01
        • 2015-08-24
        • 2011-05-10
        • 2012-08-09
        • 2020-05-01
        相关资源
        最近更新 更多