Ruby - 将哈希推送到数组

时间:2017-07-03 12:11:11

标签: arrays ruby hash

迭代时,我每次都会将一些数据保存到哈希。在同一个循环中,我将哈希值推送到数组。

以下代码不起作用,最后一个哈希对象会覆盖数组中的所有其他哈希对象。

playlists = []
aPlaylist = {}

while (count < 3)
    #some code... produces the hash "aPlaylist"
    playlist << aPlaylist
end

以下代码确实有效。为什么,有什么区别?

playlists = []

while (count < 3)
    aPlaylist = {}
    #some code... produces the hash "aPlaylist"
    playlist << aPlaylist
end

以下是正确和错误的输出(转换为csv): http://imgur.com/a/rjmBA

3 个答案:

答案 0 :(得分:2)

因为,在第一种情况下,对象与0,1和2索引相同。

playlist = []
aPlaylist = {}
count = 0

while (count < 3)
    #some code... produces the hash "aPlaylist"
    playlist << aPlaylist
    puts aPlaylist.object_id
    count += 1
end
#=> 2048
#=> 2048
#=> 2048

在第二种情况下,它会改变:

playlist = []

count = 0

while (count < 3)
    aPlaylist = {}
    #some code... produces the hash "aPlaylist"
    playlist << aPlaylist
    puts aPlaylist.object_id
    count += 1
end
#=> 2048
#=> 2038
#=> 2028

这就是为什么在第二种情况下,当您对哈希进行更改时,它不会反映在数组中的所有位置。

阅读this stackoverflow answer了解更多详情。

答案 1 :(得分:0)

aPlaylist = {}创建一个哈希,aPlaylist变量保存一个指向哈希对象的指针。

在第一个示例中,您只编辑这一个哈希对象。

aPlaylist = {}
count = 0
while (count < 3)
  puts aPlaylist.object_id
  count += 1
end
#=> 70179174789100
#=> 70179174789100
#=> 70179174789100

在第二个示例中,您将在每次迭代中创建一个新的哈希对象。这就是这段代码的工作方式。

count = 0
while (count < 3)
  aPlaylist = {}
  puts aPlaylist.object_id
  count += 1
end
#=> 70179182889040
#=> 70179182888980
#=> 70179182888920

查看打印的物品ID。

答案 2 :(得分:0)

我认为一种惯用的Ruby方法就像......

playlist = 0.upto(2).map{|count| something_that_returns_a_hash }

......或......

playlist = (0..2).map{|count| something_that_returns_a_hash }

因此:

0.upto(2).map{|count| {count => count} }

[{0=>0}, {1=>1}, {2=>2}]