31
33

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

メソッド定義場所を探してソースコードを読んでみよう

Last updated at Posted at 2014-09-12

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使ったことないけど(ノ∀`)アチャー)

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

31
33
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
33

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?