Ruby数组奇怪的行为

时间:2011-06-24 12:57:17

标签: ruby arrays

我误解了数组行为

当我创建这个矩阵时

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 : [[], [], [], [], []]

有什么不对?

2 个答案:

答案 0 :(得分:6)

问题在于您的行:

3.times { matrix << cell }

您正在使用与cell的三行相同的对象matrix

关键是Array是一个可变对象。即使您修改它,它的身份也不会改变。 cell的三个出现指向同一个实例(对象)。如果您通过一次出现来访问和修改它,其他出现的事件将反映出这种变化。

如果您将此行更改为:

3.times { matrix << cell.dup } 

然后你会得到想要的结果。

答案 1 :(得分:2)

您将相同的对象(单元格)放入矩阵中三次。

这将修复你的错误:

3.times { matrix << cell.clone } # lines

...但您可能想解释一下您尝试使用此代码解决的问题,因为可能有更好的方法......