From: Take_tk Date: 2003-11-02T22:07:03+09:00 Subject: [ruby-list:38730] Re: 多重配列のコンストラクタ ← 多重配列 たけ(tk)です。 [ruby-list:38723] 多重配列のコンストラクタ ← 多重配列 にて Take_tk さん 曰く: > class Array > def self.new2(arr,d=nil,args=[],&block) > arr = arr.dup > n = arr.shift > return Array.new(n){|x| self.new2(arr,d,args+[x],&block) } unless arr.empty? > return Array.new(n){|x| block.call(*(args+[x]))} unless d > return Array.new(n,d) unless block > raise(ArgumentError,"block with default") > end > end 順番が逆でした。↑のままだとデフォルトもブロックもない場合にエラーになっ てしまう。 class Array def self.new2(arr,d=nil,args=[],&block) arr = arr.dup n = arr.shift return Array.new(n){|x| self.new2(arr,d,args+[x],&block) } unless arr.empty? return Array.new(n,d) unless block return Array.new(n){|x| block.call(*(args+[x]))} unless d raise(ArgumentError,"block with default") end end take_tk = kumagai hidetake