#メタプログラミング説明クラス
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" 存在しない関数に対して
2012年3月4日日曜日
rubyでメタプログラミング
rubyのライブラリを使うと宣言されていない関数が利用出る場合が有ります。大抵は以下で紹介するdefine_method,method_missingを利用しています。これを背静的言語で書くと引数に条件を入れて、大量のif文が書かなければならない事が想像出来ます。このようなプログラミングだけだと逆にわかりにくくなる事が有りますが、適度に使うのは有効だとは思います。(かなりの重複が排除される事が予想出来ます)
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿