【问题标题】:array as value in hash in ruby数组作为红宝石中的哈希值
【发布时间】:2014-04-23 18:02:55
【问题描述】:

我想要一个哈希,它的键是一个字符串,值是一个数组。我尝试了以下方式:

h = Hash.new([]) # => {} 
h["one"]         # => [] 
h["two"]         # => [] 
h["one"].push 1  # => [1] 
h["one"]         # => [1] 
h["two"]         # => [1] //why did it assign it to h["two"] also??

正确的做法是什么?

【问题讨论】:

标签: ruby arrays hash


【解决方案1】:

你得到这个行为是因为你传递给new 方法的[] 没有被复制,而是在所有未设置的哈希键中被引用。所以h['one'] 引用了与h['two'] 相同的对象。所以如果你修改h['one']引用的对象(使用push方法),h['two']也会被修改。

设置将为每个哈希键初始化的默认值的正确方法是使用块:

h = Hash.new { |hash, key| hash[key] = [] }

【讨论】:

    【解决方案2】:

    我通常这样做:

    h = Hash.new { |h,k| h[k] = [] }
    h['one']
    h
    # => { 'one' => [] }
    h['two'] << 12
    h
    # => { 'one' => [], 'two' => [12] }
    

    哪个更冗长,(IMO)读起来更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      • 2011-08-10
      • 1970-01-01
      • 2020-01-08
      • 1970-01-01
      • 2015-07-18
      • 2017-06-15
      相关资源
      最近更新 更多