我想制作一个数组哈希。
如果我这样做:
res = Hash[(1..5).zip Array.new(5, [])]
我会得到这个结果:
{1=>[], 2=>[], 3=>[], 4=>[], 5=>[]}
没关系。但是,当我尝试更改其中一个数组时,Ruby会将它们全部更改,这样就不行了。
如果我这样做:
res[1] << 1
我会得到这个结果:
{1=>[1], 2=>[1], 3=>[1], 4=>[1], 5=>[1]}
我试图使用其他变体,例如:
res = Hash[(1..5).zip Array.new(5, Array.new)]
res = Hash[(1..5).zip Array.new(5, [].dup)]
res = Hash[(1..5).zip Array.new(5, [].clone)]
res = Hash[(1..5).zip Array.new(5, []).clone]
但是他们给了我相同的结果。
为什么?
答案 0 :(得分:2)
将块传递到Array.new
方法以获取具有不同对象ID的元素。然后每个数组都是一个不同的对象:
res = Hash[(1..5).zip(Array.new(n){[]})]