多次元配列,多重配列
def nd_array( arg, init=0) lm = arg.size - 1 route = lambda {|x| Array.new( arg[x]) { (x<lm)? route[x+1] : init }} route[0] end a = nd_array( [2,3,4]) # a = Array.new(2) { Array.new(3) { Array.new( 4, 0) }} # と等価 # wrong = Array.new(2, Array.new(3, Array.new( 4, 0))) # は間違い a[0].each_with_index {|row,y| row.each_with_index {|cell, x| a[1][y][x] = x+y } } p a #=> [[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], [[0, 1, 2, 3], [1, 2, 3, 4], [2, 3, 4, 5]]]
wrongのやり方で生成すると,領域を共有する(ある場所を触ると,別の部分も変化する)配列ができあがる.