迭代时,我每次都会将一些数据保存到哈希。在同一个循环中,我将哈希值推送到数组。
以下代码不起作用,最后一个哈希对象会覆盖数组中的所有其他哈希对象。
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
答案 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}]