13
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Ruby】意外と便利??methodsメソッドの話

Posted at

Rubyではオブジェクトに対して呼び出せるメソッド一覧をmethodsで取得できるのですが、このメソッドがデバックする際などに意外と便利でおすすめだよって話です🔥

シチュエーションに合わせて、private_methodsinstance_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]

参考

13
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?