为什么这段代码会填充每个数组?

Dan*_*bio 1 ruby

我有这段代码创建了一个数组([[],[],[]])和一个迭代器,它试图用数字填充相应的数组(如下所示)

array = Array.new(3,[])
10.times do
  array[0] << 2
  array[1] << 3
  array[2] << 4
end
Run Code Online (Sandbox Code Playgroud)

当我执行此代码时,我希望看到这个

[[2,2,2,2,etc....],[3,3,3,3,etc...],[4,4,4,4,4...etc]]
Run Code Online (Sandbox Code Playgroud)

但相反,我得到了这个:

[[2,3,4,2,3,4,2,3,4....repeat],[2,3,4,2,3,4,2,3,4....repeat],[2,3,4,2,3,4,2,3,4....repeat]]
Run Code Online (Sandbox Code Playgroud)

我试图用byebug它来解决它,这对我来说毫无意义.这里发生了什么?

Ama*_*dan 5

Array.new(3, [])不等于[[],[],[]].它相当于对同array = []; [array, array, array]一个数组的三个引用数组.之后array[0] << 2,你有[[2], [2], [2]],因为所有三个元素都指向同一个数组.

你想要的是Array.new(3) { [] },一个块指定默认值; 这样,[]就为每个元素创建了一个new .

更好的是,您的整个代码可以写成:

Array.new(3) { |i| Array.new(10, i + 2) }
Run Code Online (Sandbox Code Playgroud)