せかいや

いまいるここを、おもしろく http://sekai-in-the-box.appspot.com/

【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]]

よし