【Ruby】メソッドが定義されているクラスを調べる
はじめに
Rubyでは、メソッドはクラス(またはモジュール)内に定義されます。呼び出したメソッドがどのクラスで定義されているのか知りたい時、owner
メソッドが便利だなあと思ったので、その使い方をまとめたいと思います。
ownerメソッドとは
owner
メソッドは、RubyのMethodクラスに定義されているインスタンスメソッドです。メソッドが定義されている 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
でメソッドが定義されたクラスもしくはモジュールを調べることができました。
まとめ
呼び出しているメソッドの定義場所を調べることで、そのオブジェクトが継承しているクラスやモジュールを認識できるのが個人的に便利だなあと思いました。