哈希默认值未被使用

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

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

任何了解发生了什么的人? 🙂

 # Hash default if the key doesn't have a value set is an empty Array a = Hash.new([]) a[:key] < [2] pa # => {} nil pa[: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] pb # => {:key=>[2]} p b.keys # => [:key] 

Ruby版本1.8.7

当你a[:key] << 2 ,你将那个空数组默认值滑出并添加2(修改实际数组,而不是引用),而不让哈希对象知道你已经改变了什么。 您修改了a正在使用的对象作为默认值,因此您也会看到:

 pa[:wat] #=> [2] pa[:anything] #=> [2] 

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

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

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

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

也许这会有所帮助:

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