在ruby中使用2D数组for循环的麻烦

ast*_*hsy 2 ruby for-loop multidimensional-array

我学过C++,Java,现在我正在学习Ruby.
但对我而言,很难适应ruby中的迭代.

n = 4
arys = Array.new(3, Array.new(n+1, 0))

for i in 1..2
    for j in 1..n
        arys[i][j] = (i-1)*n+j
    end
end

p arys
Run Code Online (Sandbox Code Playgroud)

上述代码的输出如下

[[0, 5, 6, 7, 8], [0, 5, 6, 7, 8], [0, 5, 6, 7, 8]]
Run Code Online (Sandbox Code Playgroud)

我认为这就像C中的代码一样

for(int i = 1; i<=2; i++)
   for(int j = 1; j<=n; j++)
       arys[i][j] = (i-1)*n+j
Run Code Online (Sandbox Code Playgroud)

因此,我预计输出会像
[[0, 0, 0, 0, 0], [0, 1, 2, 3, 4], [0, 5, 6, 7, 8]]

上面两个代码之间的区别是什么?

Ale*_*kin 6

在初始化行中arys你实际上创建了一个内部数组,由最外面的数组引用了三次arys:

arys.map &:__id__
#? [
#  [0] 28193580,
#  [1] 28193580,
#  [2] 28193580
# ]
Run Code Online (Sandbox Code Playgroud)

__id__以上是唯一对象标识符的状态.

为了实现您期望的行为,应该生成三个不同的数组,例如:

ary = Array.new(5, 0)
arys = 3.times.map { ary.dup }
Run Code Online (Sandbox Code Playgroud)

请注意dup,克隆对象.现在我们有三个不同的对象(数组)

arys.map &:__id__
#? [
#  [0] 34739980,
#  [1] 34739920,
#  [2] 34739860
# ]
Run Code Online (Sandbox Code Playgroud)

并且您的代码将按预期工作.