【问题标题】:What is the use of a hash key with ":" [duplicate]带有“:”的哈希键有什么用[重复]
【发布时间】:2013-08-22 02:49:33
【问题描述】:

我了解哈希:hash1 = Hash["a" => 100 , "b" => 200]

但我不知道hash2 = Hash[:a => 100 , :b => 200] 是什么。

这两个键有什么区别?带:的密钥有什么用?

【问题讨论】:

    标签: ruby


    【解决方案1】:

    符号和字符串都可以用作哈希键。以: 开头的键是符号。

    符号是不可变的(不能更改)并且在内存中只存在一次:

    :foo.object_id == :foo.object_id    #=> true
    'foo'.object_id == 'foo'.object_id  #=> false
    

    每次在 Ruby 中使用字符串时,它都会创建一个新对象,但对于符号来说并非如此。出于这个原因,它们在 Ruby 中经常用作散列键。令人高兴的是,它们也比字符串短一个字符。

    符号在 ruby​​ 中与哈希键一样普遍,以至于 ruby​​ 1.9 引入了一种压缩语法,尤其是使用符号作为键。

    hash2 = Hash[:a => 100 , :b => 200]
    

    也可以写成:

    hash2 = Hash[a: 100, b: 200]
    

    或更常见的:

    hash2 = {a: 100, b: 200}
    

    ..如果您使用符号。

    关于symbols vs strings的更多信息。

    【讨论】:

      【解决方案2】:

      :a 是一个符号,而"a" 是一个字符串。

      :a == "a"
      # => false
      
      :a.to_s
      # => "a"
      

      因此,给定以下哈希,

      h1 = Hash["a" => 100, "b" => 200]
      h2 = Hash[:a => 100, :b => 200]
      

      我们可以按如下方式访问它们的值

      h1[:a]
      # => nil
      h1["a"]
      # => 100
      
      h2[:a]
      # => 100
      h2["a"]
      # => nil
      

      ActiveSupport 有一个HashWithIndifferentAccess,它允许:a"a" 互换。

      进一步阅读

      【讨论】:

        【解决方案3】:

        添加到@Yu Hao的答案。 hash1[:a] 与 hash1["a"] 不同:string 是符号,"string" 是常规的 ruby​​ 字符串。 Symbol 是不可变的,并且在某些情况下可能比 String(在 Ruby 中是可变的)表现更好。你可以阅读更多关于difference between symbol and string的信息。

        【讨论】:

          猜你喜欢
          • 2021-04-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-24
          • 1970-01-01
          • 2011-09-01
          • 1970-01-01
          • 2016-08-24
          相关资源
          最近更新 更多