我已经学习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
# ]
您的代码将按预期工作。