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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从Array.product填充的Ruby Hash会产生意外行为相关的知识,希望对你有一定的参考价值。

我想预先填充哈希,给定一组键和一个默认值(一个空数组)。我尝试使用#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

答案

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

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

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

以上是关于从Array.product填充的Ruby Hash会产生意外行为的主要内容,如果未能解决你的问题,请参考以下文章

用于从邮政编码填充用户地址位置的 Ruby Gem

Ruby-on-Rails:多个 has_many :通过可能吗?

ruby 参考文献has_many

ruby 参考文献has_many

ruby 透过'has_many through'协会来看

ruby 用户模型w / has_secure_password,可以更新