2012-03-23 69 views
0
a = Array.new(3,[]) 
a[1][0] = 5 
a => [[5], [5], [5]] 

我认为这没有道理! 是不是应该a => [[],[5],[]] 或者这是Ruby的特性?更改数组数组中的一个数组会更改它们;为什么?

+0

另请参阅http://stackoverflow.com/questions/4642395/in-ruby-why-does-array-newsize-object-create-an-array-consisting-of-multiple和http:// stackoverflow。 com/questions/4601652/ruby​​-array-creation-array-new-vs/4601727#4601727 – Phrogz 2012-03-23 06:35:24

回答

4

使用这个代替:

a = Array.new(3){ [] } 

与您的代码相同的对象用于每个条目的值;一旦你改变其中一个引用,你会看到所有其他引用的变化。使用上面的代码,每次需要新值时调用该块,每次返回一个新的数组


这在本质上为什么下面没有按预期工作新用户的问题类似:

str.gsub /(<([a-z]+)>/, "-->#{$1}<--" 

在上面,串插发生gsub方法之前是有史以来叫,所以它不能在你的字符串中使用当时的$1值。同样,在你的问题中,你创建一个对象,并在之前将它传递给Array.newRuby开始创建数组插槽。是的,运行时可能默认情况下调用dup项目...但这可能是灾难性的和缓慢的。因此,您可以通过块表单自行确定如何创建初始值。

+2

轻微挑剔:“一旦你改变了其中一个实例你将它们全部变异” - 实际上,只有*一个*实例,这就是正是这个问题! – 2012-03-23 09:42:13

+0

这是不好的措辞;谢谢。我改变了它。 – Phrogz 2012-03-23 12:54:43