Ruby で多重配列を簡単に生成するメソッド

ブロックを使わずに、簡単に Ruby で多重配列を生成します。Array.make(ar, ob) です。ar は配列で多重度を指定します。ob は初期化因子(初期値)ですが(省略可能)、Array.new とちがって ob をコピーしたものが入ります。なので、初期値の一部を object_id を変えない操作で変更しても、他の値に影響することはありません。

class Array
  def self.make(ar, ob=nil)
    raise "Argument class Error" unless ar.class == Array
    a = ar.dup
    ar1 = []
    a.shift.times {ar1 << (a.empty? ? (ob.dup rescue ob) : Array.make(a, ob))}
    ar1
  end
end

実行例。

p Array.make([4, 2, 3], "a")
#=>[[["a", "a", "a"], ["a", "a", "a"]],
#[["a", "a", "a"], ["a", "a", "a"]],
#[["a", "a", "a"], ["a", "a", "a"]],
#[["a", "a", "a"], ["a", "a", "a"]]]

p a = Array.new(4, "a")    #=>["a", "a", "a", "a"]
a[0].upcase!
p a    #=>["A", "A", "A", "A"]

a = Array.make([4], "a")
a[0].upcase!
p a    #=>["A", "a", "a", "a"]


野良 Gem 'utils' に追加しました(参照)。