将Hash推送到Array:last Hash覆盖以前的数组元素

sin*_*ity 3 ruby arrays hash loops

我有以下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
Run Code Online (Sandbox Code Playgroud)

这将返回一个哈希数组,其中:name键全部来自最后一个元素.

[
    [0] {
        :name => "smith"
    },
    [1] {
        :name => "smith"
    },
    [2] {
        :name => "smith"
    }
]
Run Code Online (Sandbox Code Playgroud)

我希望它能返回以下内容,但我不知道为什么最后一个Hash元素会覆盖所有以前的数组元素:

[
    [0] {
        :name => "bob"
    },
    [1] {
        :name => "jack"
    },
    [2] {
        :name => "smith"
    }
]
Run Code Online (Sandbox Code Playgroud)

编辑:谢谢大家的回答.很高兴有一些不同的方法来完成同样的事情.我测试了每个解决方案,每个解决方案都很棒.我最终使用的是与原始代码最相似的那个; 但我的用例是一个简单的本地脚本 - 它不是在工业大小的应用程序中使用 - 在这种情况下,我可能会选择不同的解决方案.

pjs*_*pjs 5

仔细查看您的代码,您将看到您只创建了一个单独的实例Hash.你的迭代器不断吹嘘早期的工作.clear,将元素设置为当前迭代,并将对一个Hash对象的引用添加到不同的数组位置array_of_hashes.但是在一天结束时,它们都指向同一个Hash对象,并且该Hash对象仅包含您放入其中的最后一个对象.