我有以下 Ruby 脚本:
arr = ['bob', 'jack', 'smith']
array_of_hashes = Array.new
hash = Hash.new
arr.each do |item|
hash.clear
hash[:name] = item
array_of_hashes << hash
end
puts array_of_hashes
这将返回一个哈希数组,其 :name 键全部来自最后一个元素。
[
[0] {
:name => "smith"
},
[1] {
:name => "smith"
},
[2] {
:name => "smith"
}
]
我希望它返回以下内容,但我无法弄清楚为什么最后一个 Hash 元素会覆盖所有以前的数组元素:
[
[0] {
:name => "bob"
},
[1] {
:name => "jack"
},
[2] {
:name => "smith"
}
]
编辑:谢谢大家的回答。很高兴有一些不同的方法来完成同样的事情。我已经测试了每一种解决方案,每一种都很棒。我最终使用了与我的原始代码最相似的代码;但我的用例是一个简单的本地脚本 - 它没有在工业规模的应用程序中使用 - 在这种情况下,我可能会选择不同的解决方案。
最佳答案
仔细查看您的代码,您会发现您只创建了一个Hash
实例。你的迭代器一直在用 .clear
打败之前的努力,将元素设置为当前迭代,并将对那个 Hash
对象的引用添加到 中的不同数组位置array_of_hashes
。但归根结底,它们都指向同一个 Hash
对象,而那个 Hash
对象只包含您最后放入其中的内容。
关于arrays - 将哈希压入数组 : last Hash overwriting previous array elements,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36273066/