我误解了数组行为
当我创建这个矩阵时
matrix, cell = [], []; 5.times { cell << [] } # columns
3.times { matrix << cell } # lines
matrix
sample_data = (0..5).to_a
matrix[1][2] = sample_data.clone
matrix.each { |line| puts "line : #{line}" }
我有这个结果
line : [[], [], [0, 1, 2, 3, 4, 5], [], []]
line : [[], [], [0, 1, 2, 3, 4, 5], [], []]
line : [[], [], [0, 1, 2, 3, 4, 5], [], []]
取而代之的是预期的结果
line : [[], [], [], [], []]
line : [[], [], [0, 1, 2, 3, 4, 5], [], []]
line : [[], [], [], [], []]
有什么不对?
答案 0 :(得分:6)
问题在于您的行:
3.times { matrix << cell }
您正在使用与cell
的三行相同的对象matrix
。
关键是Array
是一个可变对象。即使您修改它,它的身份也不会改变。 cell
的三个出现指向同一个实例(对象)。如果您通过一次出现来访问和修改它,其他出现的事件将反映出这种变化。
如果您将此行更改为:
3.times { matrix << cell.dup }
然后你会得到想要的结果。
答案 1 :(得分:2)
您将相同的对象(单元格)放入矩阵中三次。
这将修复你的错误:
3.times { matrix << cell.clone } # lines
...但您可能想解释一下您尝试使用此代码解决的问题,因为可能有更好的方法......