2012年3月4日日曜日

rubyでメタプログラミング

rubyのライブラリを使うと宣言されていない関数が利用出る場合が有ります。大抵は以下で紹介するdefine_method,method_missingを利用しています。これを背静的言語で書くと引数に条件を入れて、大量のif文が書かなければならない事が想像出来ます。このようなプログラミングだけだと逆にわかりにくくなる事が有りますが、適度に使うのは有効だとは思います。(かなりの重複が排除される事が予想出来ます)
#メタプログラミング説明クラス
class Meta
 #==abc関数を動的に追加
  define_method(:abc){|a1,a2|self.add(a1,a2)}
  #==普通の関数
  # *data1:数字
  # *data2:数字
  def add(data1,data2)
    data1 + data2
  end
  #==関数として存在しない関数に対しての処理
  def method_missing(id,*arg,&block)
    #引数の個数が2の場合強制的にaddコマンドをコール
    return add(arg[0],arg[1])   if arg.count() == 2
    super
  end
end


m = Meta.new
p m.abc(10,20)        #=> 30 追加された関数abcに対して
p m.add(10,20)        #=> 30 通常の関数に対して
p m.hoge(10,20)       #=> 30 存在しない関数に対して
p m.hoge("a","b")       #=> "ab" 存在しない関数に対して

0 件のコメント:

コメントを投稿