我想预先填充哈希,给定一组键和一个默认值(一个空数组)。我尝试使用#product
的Array
方法做到这一点。
> 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
这是因为传递给哈希初始值设定项的数组是同一个对象,因此如果您修改了所述对象,则更改将在使用它的任何位置出现:
> hash = Hash[[:foo, :bar].product([[]])]
# => {:foo=>[], :bar=>[]}
> hash[:foo].object_id
# => 47106586247680
> hash[:bar].object_id
# => 47106586247680
如果你复制粘贴你的product
的输出,你将使用2个不同的数组,因为它们分别实例化。