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

时间:2018-11-08 17:21:56

标签: ruby hash

我想预填充一个哈希,给定一个键数组和一个默认值(一个空数组)。我尝试使用#product的{​​{1}}方法执行此操作。

Array

我不明白为什么将值应用于哈希中的所有键。相反,如果我使用返回的值> hash = Hash[[:foo, :bar].product([[]])] # => {:foo=>[], :bar=>[]} > hash[:foo].push(:baz) # => {:foo=>[:baz], :bar=>[:baz]} 并直接从中填充哈希,则会得到预期的行为。

product

我正在使用ruby 2.3.6

1 个答案:

答案 0 :(得分:1)

这是因为传递给哈希初始化程序的数组是同一对象,因此,如果您修改所述对象,则更改将在使用该对象的任何地方出现:

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

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