如何填充数组(二维数组)

Ser*_* A. 1 ruby arrays

当我尝试使用循环变量填充数组数组时,我注意到了一种奇怪的行为.

N = 5
M = 4 

m = Array.new(N, Array.new(M, -1))
for j in 0..N-1
  m[j][0] = j
end

m
Run Code Online (Sandbox Code Playgroud)

这样做最终会:

4 -1 -1 -1
4 -1 -1 -1
4 -1 -1 -1
4 -1 -1 -1
4 -1 -1 -1
Run Code Online (Sandbox Code Playgroud)

但我预计:

0 -1 -1 -1
1 -1 -1 -1
2 -1 -1 -1
3 -1 -1 -1
4 -1 -1 -1
Run Code Online (Sandbox Code Playgroud)

另一方面,这可以按预期工作:

N = 5

m = Array.new(N)
for i in 0..N-1
  m[i] = i
end

puts m  # => [0, 1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?

Cho*_*ett 8

m = Array.new(N, Array.new(M, -1))创建一个size N数组,其每个成员都是同一个对象 - 一个M填充-1 的size 数组.因此,当您设置内部数组的第一个元素时,将在每个外部数组中重新选择更改,因为它们都包含相同的对象.

相反,使用块形式:

Array.new(N) { Array.new(M, -1) }
Run Code Online (Sandbox Code Playgroud)

为外部数组的每个元素调用该块,使每个元素获得不同的新内部数组.