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]