我试图从二维数组hashes
构建一个哈希数组(称为guys
)。
我有这个:
guys = [[1, 2], [3, 4]]
hash = { a: [], b: [] }
hashes = []
guys.each do |guy|
hash[:a] = guy[0]
hash[:b] = guy[1]
hashes << hash
end
puts "#{hashes}"
这导致了一系列相似的元素:
[{a: 3, b: 4}, {a: 3, b: 4}]
我不明白为什么会这样。在我看来,<<
应附加到列表的末尾。
我想要的是:
[{a: 1, b: 2}, {a: 3, b: 4}]
答案 0 :(得分:4)
您的问题是您多次将相同的 hash
对象追加到hashes
数组。在each
循环中,您只需修改相同散列的内容,因此最后一次修改将更改对该散列的所有引用。
要解决此问题,请为每个循环创建一个新的哈希对象,如下所示:
guys.each do |guy|
hash = {a: guy[0], b: guy[1]}
hashes << hash
end
答案 1 :(得分:0)
实现你想要的另一种方式。但不使用Array#each
。
guys = [[1, 2], [3, 4]]
hash = { a: [], b: [] }
guys.map { |e| { a: e[0], b: e[1] } }
# => [{:a=>1, :b=>2}, {:a=>3, :b=>4}]
Array#map也为数组的每个元素执行给定的块,但返回一个新数组,其值是块的每次迭代的返回值。