Rubyではオブジェクトに対して呼び出せるメソッド一覧をmethods
で取得できるのですが、このメソッドがデバックする際などに意外と便利でおすすめだよって話です🔥
シチュエーションに合わせて、private_methods
やinstance_methods
などの類似メソッドも交えながらまとめてみました。
概要
methods
- 対象オブジェクトに対して呼び出せるメソッドの一覧を、シンボル配列の形で返却します。
private_methods
- 対象オブジェクトに対して呼び出せるprivateメソッドの一覧を、シンボル配列の形で返却します。
instance_methods
- 対象クラスのインスタンスに対して呼び出せるメソッドの一覧を、シンボル配列の形で返却します。
全てデフォルトではスーパークラスや基底クラス(Objectなど)のインスタンスメソッドも返却されます。
サンプルコード
以下のコードはこのサンプルコードを前提に記述しています。
class SuperSample
def super_sample; end
private; def private_super_sample; end
end
class Sample < SuperSample
def sample; end
private; def private_sample; end
end
使い方
オブジェクトが応答できるメソッドを全て取得したい
methods
の結果にprivate_methods
の結果を加えることで取得できます。
sample = Sample.new
sample.methods + sample.private_methods
# => [:sample, :super_sample, :private_sample, :private_super_sample, :to_json, :to_s,....]
オブジェクトが応答できるprivate以外のメソッドを全て取得したい
methods
を使って取得できます。
sample = Sample.new
sample.methods
# => [:sample, :super_sample, :to_json, :to_s,....]
基底クラスのインスタンスメソッドを除いてて取得したい
基底クラスのインスタンスメソッドをmethods
の返却値から除くことで取得できます。
sample = Sample.new
sample.methods - Object.instance_methods
# => [:sample, :super_sample]
対象オブジェクトのインスタンスメソッドのみを取得したい
スーパークラスのインスタンスメソッドを除くことで取得できます。
sample = Sample.new
sample.methods - sample.class.superclass.instance_methods
# => [:sample]
また対象オブジェクトのクラスに対して、instance_methods
を引数false
指定で使用しても取得できます。
Sample.instance_methods(false)
# => [:sample]