数组作为ruby中的哈希值

时间:2014-04-23 08:55:49

标签: ruby arrays hash

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

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??

这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:4)

您会收到此行为,因为您传递给[]方法的new未被复制,但在所有未设置的哈希键中引用。因此h['one']引用与h['two']相同的对象。因此,如果您修改h['one']引用的对象(使用push方法),h['two']也将被修改。

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

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

答案 1 :(得分:3)

我通常这样做:

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

哪个更详细,(IMO)读得更好。