【问题标题】:How can I initialize an Array inside a Hash in Ruby [duplicate]如何在 Ruby 中初始化 Hash 中的数组 [重复]
【发布时间】:2011-05-23 13:03:15
【问题描述】:

我正在尝试初始化数组的哈希,例如

@my_hash = Hash.new(Array.new)

这样我可以:

@my_hash["hello"].push("in the street")
=> ["in the street"]
@my_hash["hello"].push("at home")
=> ["in the street", "at home"]
@my_hash["hello"]
=>["in the street", "at home"]

问题是任何新的哈希键也会返回["in the street", "at home"]

@my_hash["bye"]
=> ["in the street", "at home"]
@my_hash["xxx"]
=> ["in the street", "at home"]

!!!???

我做错了什么初始化数组哈希的正确方法是什么?

【问题讨论】:

标签: ruby arrays hash


【解决方案1】:

Hash.new 的参数是新哈希键的默认值,因此当您传递一个引用时,该引用将用于新的哈希键。当您调用时,您正在更新该引用...

hash["key"].push "value"

在将值推送到哈希键之前,您需要将新引用传递给哈希键...

hash["key1"] = Array.new
hash["key1"].push "value1"
hash["key2"] = Array.new
hash["key2"].push "value2

您也可以尝试将其封装到辅助方法中。

【讨论】:

    【解决方案2】:

    试试这个:

    @my_hash = Hash.new { |h, k| h[k] = Array.new }
    

    【讨论】:

      【解决方案3】:
      @my_hash = Hash.new(Array.new)
      

      这只会创建一个数组对象,每次找不到键时都会返回该对象。由于您只改变了该数组而从未创建新数组,因此您的所有键都映射到同一个数组。

      你想做的是:

      @my_hash = Hash.new {|h,k| h[k] = Array.new }
      

      或者干脆

      @my_hash = Hash.new {|h,k| h[k] = [] }
      

      将块传递给Hash.new 与简单地以两种方式传递参数不同:

      1. 每次未找到密钥时都会执行该块。因此,您每次都会得到一个新数组。在带有参数的版本中,该参数被评估一次(在调用new 之前),并且每次都返回其结果。

      2. 通过h[k] =,您实际上将密钥插入到哈希中。如果您不这样做,仅访问 @my_hash[some_key] 实际上不会导致 some_key 被插入到哈希中。

      【讨论】:

      • 这里要注意的一个问题是,现在即使 检查 密钥也会创建它,这可能不是您想要的。出于这个原因,我有时会正常创建哈希(仅使用 {}),然后在调用中创建数组,例如 (@myhash["hello"] ||= []).push("in the street")
      猜你喜欢
      • 1970-01-01
      • 2014-10-13
      • 2015-11-30
      • 1970-01-01
      • 1970-01-01
      • 2012-12-08
      • 1970-01-01
      • 2021-05-07
      • 1970-01-01
      相关资源
      最近更新 更多