【Ruby】どこでメソッド定義されているかを調べる
Railsをはじめて触ったとき
3.days
のように書けてしまうので驚いた方も多いのではないでしょうか。
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さんが基本クラスを拡張してることがわかったので、そのソースを読んでいけば良いです(*´ω`*)
他人のソースを読むときなどに、
「このメソッド、どのクラスで定義されているのかな」
とか、
「このメソッドが定義されている場所はどこかな、ソースコード上のどこで定義されているのかな」
と思った時に思い出すと幸せになれます。