RubyはModuleで組み込まれたメソッドや、method_missing
を利用した「ゴーストメソッド」など、自分の見ているメソッドがそのクラス以外のどこで定義されているのか、分かりにくいケースがよくあります。
特にJavaやC#から移ってきた僕のようなプログラマは、「メソッド = どこかのクラスで定義されているもの」という印象が強いので、「持ち主がよく分からないメソッド」の存在はデバッグ等で苦労させられます。
こういったケースでは、Kernel#method
とMethod#source_location
を組み合わせることで、メソッドの定義場所を見つけることができます。
たとえば、rails consoleでblank?
メソッドの定義場所を見つけたい場合は、こんな感じです。
$ rails c
> 'x'.method(:blank?).source_location
=> ["/Users/mypc/.rvm/gems/ruby-1.9.2-p320/gems/activesupport-3.2.3/lib/active_support/core_ext/object/blank.rb", 102]
制限事項
-
Method#source_location
はRuby 1.9以上でしか使えません。 - irbやrails consoleで簡単にチェックできるメソッドならいいですが、gemの奥まった処理で使われているメソッドなどを調査しようと思うと、結構大変かもしれません。
参考
2014.12.10 追記
最近はこの方法ではなく、 RubyMine を使ってます。
RubyMine、便利!
RubyMineのコードジャンプ機能は本当にすごい!!困ったときはCommand+Bを押すべし!
2017.1.30 追記
定数(クラス名やモジュール名を含む)の定義場所を調べたい場合はこちらの記事を参考にしてください。