Reflection

Reflection, ObjectSpace, and Distributed Ruby

Rubyで動的に与えられたメソッド名からメソッドを呼び出すのってどうやるんだろう?って思ってreflectionっていうキーワードで検索したら、見つかりました。めっちゃ簡単じゃないですか。素敵過ぎ。

obj.send( "some_method" ) if obj.respond_to?( "some_method" )

some_methodというメソッドが実装されてたら(正確にはpublicだったら)それを引数なしで呼び出すコード。


それからActiveRecord::Baseから派生したクラスに、ある名前のクラスメソッドがあったらそれを呼び出すっていうのをまとめてやりたかったので、以下のコードを書いてみた。

classes = [];
ObjectSpace.each_object(Class) {|x| classes << x if x < ActiveRecord::Base }
classes.each{ |klass|
    klass.send( "some_method" ) if klass.respond_to?( "some_method")
}

classesの作り方がちょっと書き方がダサい気もするけど、一応動く。でも、この処理の前にrequireしておかないと、期待しているクラスが見つからないこともある。

つうわけで、modelsのクラスをまとめてロードするような方法ってないかな?と思ってdependencies.rbあたりで何とかならないか調査中。