在 Ruby 如何找到方法的定義?
剛好昨天有朋友問到,就順便筆記一下。
Ruby 官方文件很多,但有時對入門的朋友來說,常會遇到「我想看看 XX 方法的詳細用法,我該找哪個類別或模組的文件?」的問題。簡單的說,「常翻文件」就是這個問題最好的答案啦,除此之外,你也可以使用 Object#method 來找。
例如我想要知道 puts
這個很常用的方法是定義在哪邊的:
print method(:puts) # <Method: Object(Kernel)#puts>
它會回傳一個 Method 類別的實體,並且寫著 Object(Kernel)#puts
,表示這個 puts
方法是被定義在 Object 的(事實上是在 Kernel,透過 Mixin 混到 Object 裡的)
回傳的這個 Method 類別實體其實也可以直接呼叫,例如:
my_puts = method(:puts)
my_puts.call("Hello Ruby")
另外在寫 Rails 的時候,有時候想要知道某個好用的方法或 helper 是放在哪邊,想看看原始碼是怎麼寫的,也可以透過這個方式(Ruby 1.9 限定):
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 類別