我试图创建一个哈希数组,我已经在这里找到了一些优秀的解决方案:
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上试用
答案 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 }