如何断开创建的对象之间的链接

时间:2016-09-27 08:59:42

标签: ruby

我想制作一个数组哈希。

如果我这样做:

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]

但是他们给了我相同的结果。

为什么?

1 个答案:

答案 0 :(得分:2)

将块传递到Array.new方法以获取具有不同对象ID的元素。然后每个数组都是一个不同的对象:

res = Hash[(1..5).zip(Array.new(n){[]})]