哈希默认值未被使用

时间:2010-04-22 15:25:47

标签: ruby hash default-value

今天我尝试了以下代码片段,我不明白为什么我们之间会得到不同的结果。据我所知,他们是一样的。

一个使用默认值off Hash,另一个代码段会在访问密钥之前为密钥创建一个空数组。

任何了解发生了什么的人? :)

# Hash default if the key doesn't have a value set is an empty Array
a = Hash.new([])
a[:key] << 2 # => [2]
p a # => {} nil
p a[:key] # => [2]
p a.keys # => []
p a.values # => []

# Explicitly add an array for all nodes before creating
b = Hash.new
b[:key] ||= []
b[:key] << 2 # => [2]
p b # => {:key=>[2]}
p b.keys # => [:key]

Ruby版本1.8.7

2 个答案:

答案 0 :(得分:5)

也许这会有所帮助:

a = Hash.new { |hash, key| hash[key] = [] }
a[:key] << 2 # => [2]
a[:key]      # => [2]
p a          # => {:key=>[2]}

答案 1 :(得分:4)

当您执行a[:key] << 2时,您将该空数组默认值滑出并添加2(修改实际数组,而不是引用),而不让哈希对象a知道您已更改任何东西。您修改了a正在使用的对象作为默认值,因此您也会看到这一点:

p a[:wat] #=> [2]
p a[:anything] #=> [2]

在第二个示例中,您创建了一个新数组,并使用b[:key]=告诉b它在该键下具有值。

如果你想要两全其美,试试这个:

c = Hash.new([])
c[:key] += [2]

这将访问c[:key]并使用+创建一个新数组并重新分配。