Help us understand the problem. What is going on with this article?

Object#methods(false)とModule#instance_methods(false)の違い

More than 5 years have passed since last update.

Rubyでクラスに実装されているメソッド(親クラス分を除く)を調べる - igaiga diary(2014-04-30)より。

あるクラスに実装されているメソッド(親クラス分を除く)を調べるにはArrayの場合は [].methods(false) かなと思ったけど結果が思ったのと違う。

@hsbtさんに聞いたら Array.instance_methods(false) でインスタンスメソッドが見れると教えてくれた。便利。

具体的にどう違うのか、試してみた。

先に結論から

調べたいものによって、methodsとinstance_methodsや引数のtrue, falseを使い分ける。

  • 一般的なクラスのインスタンスのメソッドを調べたいなら Module#instance_methods を使う
    • 親クラスを含める … Array.instance_methods(true)
    • 親クラスを含めない … Array.instance_methods(false)
  • 特異メソッドを含めて調べたいなら Object#methods を使う
    • 親クラスを含める … [].methods(true)
    • 自身の特異メソッドのみ … [].methods(false)

methodsとinstance_methodsの違い

引数に何も付けないと、どちらも親クラスを含むメソッド一覧を返す。

Array.instance_methods.size
# => 177
[].methods.size
# => 177
Array.instance_methods - [].methods
# => []

オブジェクトに特異メソッドが定義されていない限り、結果は同じ。

methods(false)とinstance_methods(false)の違い

引数にfalseをつけると挙動が変わる。

Object#methods(false)は、自身の特異メソッド一覧を返す。

[].methods(false).size
# => 0

一方、Module#instance_methods(false)は親クラス分を除くメソッド一覧を返す。

Array.instance_methods(false).size
=> 93

特異メソッドを定義した場合

オブジェクトに特異メソッドを定義すると、(当然だが)Object#methodsの方が数が多くなる。

arr = []
def arr.test; end

Array.instance_methods.size
# => 177
arr.methods.size
# => 178
arr.methods - Array.instance_methods
# => [:test]

参考文献

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away