読者です 読者をやめる 読者になる 読者になる

【Ruby】メソッドの定義場所を調べる

スポンサーリンク

Ruby でメソッドが定義されている場所を調べる方法です。

定義場所の調べ方

Ruby や Rails でコードを書いてるとメソッドのソースを見たい時があります。しかし Ruby に慣れてないとソースがどこに定義されているのか分からないことも多いです。そのような場合にMethodProcクラスに定義されているsource_locationメソッドを使用することで、ソースコードと定義されている行番号が確認できます。

Methodオブジェクトを作成するにはObject#methodを使用します。

User.where(role: admin)
method = user.method(:size)
method.source_location
=> ["/Users/tasukujp/testapp/vendor/bundle/ruby/2.3.0/gems/activerecord-4.2.7/lib/active_record/relation.rb", 257]

実際にソースファイルを確認すると間違いなく257行目に定義されています。

256     # Returns size of the records.
257     def size
258       loaded? ? @records.length : count(:all)
259     end
...

別のメソッドも確認してみましょう。

method = user.method(:count)
method.source_location
=> ["/Users/tasukujp/testapp/vendor/bundle/ruby/2.3.0/gems/activerecord-4.2.7/lib/active_record/relation/calculations.rb", 38]

こちらも問題ないですね。

38     def count(column_name = nil, options = {})
39       if options.present? && !ActiveRecord.const_defined?(:DeprecatedFinders)
40         raise ArgumentError, "Relation#count does not support finder options anymore. " \
41                              "Please build a scope and then call count on it or use the " \
42                              "activerecord-deprecated_finders gem to enable this functionality."
43
44       end
...

例外として定義場所がネイティブコードの場合は nil が返却されます。

file = File.open('/Users/tasukujp/hoge.csv')
method = file.method(:each_line)
method.source_location
=> nil