多次元配列,多重配列

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のやり方で生成すると,領域を共有する(ある場所を触ると,別の部分も変化する)配列ができあがる.