我已经学习C++,Java,我现在正在学习露比。
但对我来说很难适应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

以上代码输出如下
[[0, 5, 6, 7, 8], [0, 5, 6, 7, 8], [0, 5, 6, 7, 8]]

我想它就像下面C语言中的代码
for(int i = 1; i<=2; i++)
   for(int j = 1; j<=n; j++)
       arys[i][j] = (i-1)*n+j

因此,我希望输出如下
[[0, 0, 0, 0, 0], [0, 1, 2, 3, 4], [0, 5, 6, 7, 8]]
上面两个代码有什么区别?

最佳答案

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

arys.map &:__id__
#⇒ [
#  [0] 28193580,
#  [1] 28193580,
#  [2] 28193580
# ]

__id__以上状态。
为了达到您预期的行为,应该生成三个不同的数组,例如:
ary = Array.new(5, 0)
arys = 3.times.map { ary.dup }

注意,上面的dup克隆了对象。现在我们有三个不同的对象(数组)
arys.map &:__id__
#⇒ [
#  [0] 34739980,
#  [1] 34739920,
#  [2] 34739860
# ]

您的代码将按预期工作。

10-08 00:26