arrays - 将哈希压入数组 : last Hash overwriting previous array elements

标签 arrays ruby loops hash

我有以下 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/

相关文章:

ruby - 如何使用 XPath 和 nokogiri 解析 for 循环内的 inner_html

swift - 在循环中使用 dispatchQueue

python - 遍历 python 列表列表并根据条件删除列表

variables - METAPOST:在标签中使用循环变量

ruby-on-rails - Ruby/Rails 将字符串转换为类属性

javascript - 带 form_tag 的动态选择菜单

c++ - copy() 将除最后一个元素之外的所有元素从 vector 复制到数组 C++

javascript - 存储字母表中每个字母在字符串中所需位置出现的次数

c - 将数据添加到从循环内的结构读取的数组中

c++ - 将 vector 更改为数组会使我的程序变慢