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

时间:2012-03-23 06:31:02

标签: ruby arrays

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

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

1 个答案:

答案 0 :(得分:4)

请改用:

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

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


这在性质上类似于新用户的问题,说明为什么以下内容无法正常工作:

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

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