【Ruby】どこでメソッド定義されているかを調べる

Railsをはじめて触ったとき

3.days

のように書けてしまうので驚いた方も多いのではないでしょうか。

Rubyでは、自分のソースコードの好きなところで

class Numeric
  # Numericクラスにfoobarメソッドを追加する
  def foobar
    p 'foobar'
  end
end

3.foobar
=> "foobar"

のように、基本クラスを拡張できてしまいますので、どこでメソッド定義されているのか探すのが大変です。

そこでRubyでは、Method#owner(), Method#source_location()という定義情報にアクセス出来るメソッドが用意されています。
それでは「3.days」がどこで定義されているか調べてみましょう。

m = 3.method(:days) # Methodオブジェクトが返却される
m.owner #  定義されているクラス
=> Numeric 
m.source_location # [パス, 行番号]という配列 
=> ["/path/to/vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.8/lib/active_support/core_ext/numeric/time.rb", 49]

※source_locationはRuby1.9以降のメソッドです
ということで情報が得られたので、activesupportさんが基本クラスを拡張してることがわかったので、そのソースを読んでいけば良いです(*´ω`*)


他人のソースを読むときなどに、
「このメソッド、どのクラスで定義されているのかな」
とか、
「このメソッドが定義されている場所はどこかな、ソースコード上のどこで定義されているのかな」
と思った時に思い出すと幸せになれます。

Rubyでは、JavaEclipseのようにGUIで簡単に探す方法がなくて大変ですね。。)

参考URL:
http://ruby-doc.org/core-1.9.3/Method.html