【Ruby】多重配列(初期値に気をつける)
エイトクイーン問題を解くべく、
今まで使ったことのないRubyでの多重配列をおべんきょう。
NG例
初期値でオブジェクトを設定すると
全要素が同じオブジェクトを参照してしまう。
Array.new(初期値オブジェクト)は、
全要素が同じオブジェクトを参照するためNG
NGコード
def make_board(size) a = Array.new(size, Array.new(size, 0)) p a[0].object_id p a[1].object_id p a[0][1] = 2 p a end board = make_board(8)
■実行結果
23451984 23451984 2 [[0, 2, 0, 0, 0, 0, 0, 0], [0, 2, 0, 0, 0, 0, 0, 0], [0, 2, 0, 0, 0, 0, 0, 0], [0, 2, 0, 0, 0, 0, 0, 0], [0, 2, 0, 0, 0, 0, 0, 0], [0, 2, 0, 0, 0, 0, 0, 0], [0, 2, 0, 0, 0, 0, 0, 0], [0, 2, 0, 0, 0, 0, 0, 0]]
OK例
mapメソッドを使ってオブジェクトを都度生成する。
OKコード
def make_board(size) a = Array.new(size).map! { Array.new(size, 0) } p a[0].object_id p a[1].object_id p a[0][1] = 2 p a end board = make_board(8)
■実行結果
23026836 23026824 2 [[0, 2, 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], [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, 0, 0]]
よし