リファクタリング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でもクラス定義はクラスファイルを吐いていることから、あんまりクラス定義は動的にしないものなのかなぁとか思ったりもする。