我有这段代码创建了一个数组([[],[],[]])和一个迭代器,它试图用数字填充相应的数组(如下所示)
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它来解决它,这对我来说毫无意义.这里发生了什么?
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)