LoginSignup
10
10

More than 5 years have passed since last update.

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

Posted at

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]

参考文献

10
10
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
10
10