从Array.product填充的Ruby Hash会产生意外行为
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从Array.product填充的Ruby Hash会产生意外行为相关的知识,希望对你有一定的参考价值。
我想预先填充哈希,给定一组键和一个默认值(一个空数组)。我尝试使用#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个不同的数组,因为它们分别实例化。
以上是关于从Array.product填充的Ruby Hash会产生意外行为的主要内容,如果未能解决你的问题,请参考以下文章