a = Array.new(3,[])
a[1][0] = 5
a => [[5], [5], [5]]
我认为这没有道理! 是不是应该a => [[],[5],[]] 或者这是Ruby的特性?更改数组数组中的一个数组会更改它们;为什么?
a = Array.new(3,[])
a[1][0] = 5
a => [[5], [5], [5]]
我认为这没有道理! 是不是应该a => [[],[5],[]] 或者这是Ruby的特性?更改数组数组中的一个数组会更改它们;为什么?
使用这个代替:
a = Array.new(3){ [] }
与您的代码相同的对象用于每个条目的值;一旦你改变其中一个引用,你会看到所有其他引用的变化。使用上面的代码,每次需要新值时调用该块,每次返回一个新的数组。
这在本质上为什么下面没有按预期工作新用户的问题类似:
str.gsub /(<([a-z]+)>/, "-->#{$1}<--"
在上面,串插发生gsub
方法之前是有史以来叫,所以它不能在你的字符串中使用当时的$1
值。同样,在你的问题中,你创建一个对象,并在之前将它传递给Array.new
Ruby开始创建数组插槽。是的,运行时可能默认情况下调用dup
项目...但这可能是灾难性的和缓慢的。因此,您可以通过块表单自行确定如何创建初始值。
轻微挑剔:“一旦你改变了其中一个实例你将它们全部变异” - 实际上,只有*一个*实例,这就是正是这个问题! – 2012-03-23 09:42:13
这是不好的措辞;谢谢。我改变了它。 – Phrogz 2012-03-23 12:54:43
另请参阅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