更改数组数组中的一个数组会改变所有数组; 为什么?

a = Array.new(3,[]) a[1][0] = 5 a => [[5], [5], [5]] 

我觉得这没有意义! 是不是应该a => [[],[5],[]]或者这种Ruby的function?

改为使用它:

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

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


这在性质上与新用户问题类似,关于为什么以下内容无法按预期工作:

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

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