(今日の独り言)
[ [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0] ]という 配列(10)の配列(3)を作ろうと
buf = Array.new(3, Array.new(10,0))と書いてしまうと思ったような動作をしてくれない
例えば配列(10)の末尾にそれぞれ違う数値を追加して
[ [0,0,0,0,0,0,0,0,0,0,1], [0,0,0,0,0,0,0,0,0,0,2], [0,0,0,0,0,0,0,0,0,0,3] ]というものにしたい場合
buf[0] << 1 buf[1] << 2 buf[2] << 3と書いても、何故か
[ [0,0,0,0,0,0,0,0,0,0,1,2,3], [0,0,0,0,0,0,0,0,0,0,1,2,3], [0,0,0,0,0,0,0,0,0,0,1,2,3] ]というものになってしまう
この挙動から考えてこの配列(10)は全て同じものを参照していると考えられる
つまり 配列(10)の実体は一つしかなく
buf[0] も buf[1] も buf[2] も同じ配列(10)へのポインタであると推測される
もちろん理想は「配列(10)は3つとも別の実体」でなければならない
よってこの問題を回避するには、素直に
buf = [ [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0] ]と書くか
buf = Array.new(3){Array.new(10,0)}と書けばいい