从Array.product填充的Ruby Hash会产生意外行为

问题描述 投票:0回答:1

我想预先填充哈希,给定一组键和一个默认值(一个空数组)。我尝试使用#productArray方法做到这一点。

> hash = Hash[[:foo, :bar].product([[]])]   # => {:foo=>[], :bar=>[]}
> hash[:foo].push(:baz)                     # => {:foo=>[:baz], :bar=>[:baz]}

我不明白为什么该值被应用于散列中的所有键。相反,我使用product的返回值并直接从中填充哈希,我得到预期的行为。

> [:foo, :bar].product([[]])              # => [[:foo, []], [:bar, []]]
> hash = Hash[[[:foo, []], [:bar, []]]]   # => {:foo=>[], :bar=>[]}
> hash[:foo].push(:baz)                   # => {:foo=>[:baz], :bar=>[]}

我使用的是ruby 2.3.6

ruby hash
1个回答
1
投票

这是因为传递给哈希初始值设定项的数组是同一个对象,因此如果您修改了所述对象,则更改将在使用它的任何位置出现:

> hash = Hash[[:foo, :bar].product([[]])]
 # => {:foo=>[], :bar=>[]} 
> hash[:foo].object_id
 # => 47106586247680 
> hash[:bar].object_id
 # => 47106586247680

如果你复制粘贴你的product的输出,你将使用2个不同的数组,因为它们分别实例化。

© www.soinside.com 2019 - 2024. All rights reserved.