为什么.each这里为数组中的每个项产生相同的值?

时间:2015-08-11 01:51:34

标签: arrays ruby hash

我试图从二维数组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}]

2 个答案:

答案 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也为数组的每个元素执行给定的块,但返回一个新数组,其值是块的每次迭代的返回值。