Edited at

Rubyでメソッドの定義場所を見つける方法

More than 1 year has passed since last update.

RubyはModuleで組み込まれたメソッドや、method_missingを利用した「ゴーストメソッド」など、自分の見ているメソッドがそのクラス以外のどこで定義されているのか、分かりにくいケースがよくあります。

特にJavaやC#から移ってきた僕のようなプログラマは、「メソッド = どこかのクラスで定義されているもの」という印象が強いので、「持ち主がよく分からないメソッド」の存在はデバッグ等で苦労させられます。

こういったケースでは、Kernel#methodMethod#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 追記

定数(クラス名やモジュール名を含む)の定義場所を調べたい場合はこちらの記事を参考にしてください。

Rubyでclassやconstの定義位置を調べる方法 - Qiita