高見龍

iOS app/Ruby/Rails Developer & Instructor, 喜愛非主流的新玩具 :)

在Ruby如何找到方法的定義?

剛好昨天有朋友問到,就順便筆記一下。

Ruby官方文件很多,但有時對入門的朋友來說,常會遇到「我想看看XX方法的詳細用法,我該找哪個類別或模組的文件?」的問題。簡單的說,「常翻文件」就是這個問題最好的答案啦,除此之外,你也可以使用”Object#method“來找。

例如我想要知道puts這個很常用的方法是定義在哪邊的:

1
print method(:puts)   # <Method: Object(Kernel)#puts>

它會回傳一個Method類別的實體,並且寫著Object(Kernel)#puts,表示這個puts方法是被定義在Object的(事實上是在Kernel,透過Mixin混到Object裡的)

回傳的這個Method類別實體其實也可以直接呼叫,例如:

1
2
my_puts = method(:puts)
my_puts.call("Hello Ruby")

另外在寫Rails的時候,有時候想要知道某個好用的方法或helper是放在哪邊,想看看原始碼是怎麼寫的,也可以透過這個方式(Ruby 1.9限定):

1
2
3
require 'active_support/all'
puts 10.day.method(:ago).source_location
# ["/Users/eddie/.rvm/gems/ruby-1.9.2-p180/gems/activesupport-3.0.9/lib/active_support/core_ext/numeric/time.rb", 63]

Method#source_location會回傳一個陣列,裡面放著檔名以及在第幾行。

參考資料:

Ruby API – Method類別

Comments