Ruby数组的哈希意外行为

时间:2014-12-10 17:37:40

标签: ruby arrays hash

我试图创建一个哈希数组,我已经在这里找到了一些优秀的解决方案:

Creating array of hashes in ruby

然而,在我自己尝试时,我发现了一些我不理解的行为。

在IRB中创建哈希数组:

array_hashes = Array.new(7, Hash.new)

现在,在尝试将键,值对分配给数组时:

array_hashes[1]["hello"] = 200

我在控制台中输入了以下内容:

=>[{"hello"=>200}, {"hello"=>200}, {"hello"=>200}, {"hello"=>200}, {"hello"=>200}, {"hello"=>200}, {"hello"=>200}]

在所有数组元素中重复相同的键值,当我尝试将另一个键值赋值给单个数组元素时类似的结果

array_hashes[3]["world"] = 300
=>[{"hello"=>200, "world"=>300}, {"hello"=>200, "world"=>300}, {"hello"=>200, "world"=>300}, {"hello"=>200, "world"=>300}, {"hello"=>200, "world"=>300}, {"hello"=>200, "world"=>300}, {"hello"=>200, "world"=>300}] 

任何人都可以解释其原因,特别是为什么哈希值在所有数组元素上重复,即使分配给单个元素也是如此。 谢谢!

  

使用的Ruby版本:1.9.3,在Windows 7和OS X Yosemite上试用

1 个答案:

答案 0 :(得分:3)

它重复了,因为这段代码的作用是什么:

array_hashes = Array.new(7, Hash.new)

这是:

hash = Hash.new
array_hashes = [hash, hash, hash, hash, hash, hash, hash]

所以它在数组中包含7次相同的对象。

但你想做的是:

array_hashes = Array.new(7) { Hash.new }