在写一段代码,其中一个片段是要初始化一个形如:
| 0 | 1 | 2 | 3 | 4 |
| 1 | 0 | 0 | 0 | 0 |
| 2 | 0 | 0 | 0 | 0 |
| 3 | 0 | 0 | 0 | 0 |
的二维数组,于是我用了以下非常难看的代码实现:
dif = Array.new(row_length, Array.new(column_length, 0))
(0...row_length).each do |i|
dif[i][0] = i
end #mark1
(0...column_length).each do |i|
dif[0][i] = i
end
结果生成了:
| 0 | 1 | 2 | 3 | 4 |
| 0 | 1 | 2 | 3 | 4 |
| 0 | 1 | 2 | 3 | 4 |
| 0 | 1 | 2 | 3 | 4 |
不得其解,于是打断点看数据,发现在mark1
处数据被写成了:
| 3 | 0 | 0 | 0 | 0 |
| 3 | 0 | 0 | 0 | 0 |
| 3 | 0 | 0 | 0 | 0 |
| 3 | 0 | 0 | 0 | 0 |
于是便想到会不会是这里这个循环中
经过 @luikore 和身边的 @chunlea 提点,查了下文档,发现:
i
的实例化过程并不和我所想的,每次循环时下面语句被重新改写……这个问题是不是在编译过程当中产生的?Array.new(size, default)
方法中这个default
在填充数组的时候共用object_id
,即为同一个对象,因此对其赋值要有一定的觉悟……