Railsをはじめて触ったとき
5.days
と書けてびっくり(゚д゚)!した人も多いのではないでしょうか。
数字クラスがhours
とかdays
とかのメソッドを持ってるんですよね。
Rubyでは、自分のソースコードの好きなところで
# Numericクラスにメソッドを追加
class Numeric
def
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 # 定義場所と行番号を返却
=> ["/my/preoj/vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.8/lib/active_support/core_ext/numeric/time.rb", 49]
以上のように、NumericクラスをActiveSupportが拡張していることがわかりました。
Railsや他人のコードを読んでいる時に、「この挙動、どうなっているんだろう」と思った時に思い出すと幸せになれます。
Rubyでは、JavaのEclipseのようにGUIで簡単に探す方法がなくて大変ですね!(Java使ったことないけど(ノ∀`)アチャー)