Rubyでまとめて動的クラス定義
リファクタリングRubyエディションを読んでいたら、def_eachというイカしたメソッドがあった。まとめて、似たようなメソッド定義をするものだ。
ここで、まとめて似たようなクラス定義をする関数もあったらいいなと思ったので作ってみた。役立つか微妙だが*。
hierarchy階層に、super_classを親クラスとしたクラスが定義される。
def def_class_each(classes,hierarchy,super_class,&block)
hierarchy ||= Object
super_class ||= Object
classes.each do |clas|
next if hierarchy.const_defined? clas,false
c = hierarchy.const_set clas, Class.new(super_class)
c.class_exec(clas, &block)
end
end
こんな感じで使う。
def_class_each [:Hoge,:Fuga],nil,nil do |clas|
define_method("my") do |*args|
"This class is #{clas}."
end
end
puts Hoge.new.my #=> This class is Hoge.
puts Fuga.new.my #=> This class is Fuga.
*ActiveRecordでもクラス定義はクラスファイルを吐いていることから、あんまりクラス定義は動的にしないものなのかなぁとか思ったりもする。