Webエンジニアへの転職を目指して、現在Ruby、Railsを学習中。

【Ruby】メソッドが定義されているクラスを調べる

はじめに

Rubyでは、メソッドはクラス(またはモジュール)内に定義されます。呼び出したメソッドがどのクラスで定義されているのか知りたい時、ownerメソッドが便利だなあと思ったので、その使い方をまとめたいと思います。

ownerメソッドとは

ownerメソッドは、RubyMethodクラスに定義されているインスタンスメソッドです。メソッドが定義されている class か module を返しますRuby 2.5.0 リファレンスマニュアル

実際に使ってみる

class A
  def method_a; end
end

a = A.new

a.method(:method_a).owner
#=> A          

method_aが定義されているAクラスを返しています。

上記では、以下のように、a.method(:method_a)で、Methodクラスのインスタンスを生成し、それに対してownerメソッドを呼び出しています。

a.method(:method_a).class

#=> Method          

このように、ownerメソッドが定義されているMethodクラスは、Object#method によりオブジェクト化されたメソッドオブジェクトのクラスです。Ruby 2.5.0 リファレンスマニュアル

継承されたメソッドも同様

継承されたメソッドも同様に調べることができます。

class A
  def method_a; end
end

class B < A; end

b = B.new

b.method(:method_a).owner
#=> A                   

上記は、Aクラスを返します。

module M
  def method_m; end
end

class A
  include M
end

class B < A; end

b = B.new

b.method(:method_m).owner
#=> M                   

上記は、Mモジュールを返します。

このように、ownerでメソッドが定義されたクラスもしくはモジュールを調べることができました。

まとめ

呼び出しているメソッドの定義場所を調べることで、そのオブジェクトが継承しているクラスやモジュールを認識できるのが個人的に便利だなあと思いました。