Object#methodsとModule#instance_methodsの違い

Object#methodsもModule#instance_methodsもメソッド名のシンボルの配列を返します。
しかし表記からも明らかなように、methodsメソッドはオブジェクトをレシーバとするメソッド、instance_methodsはモジュールまたはクラスをレシーバとするメソッドです。

具体的に考える

次のようなクラスを考えてみます。

class My
  def my_method; end
end

このとき

p My.ancestors
#=> [My, Object, Kernel, BasicObject]
puts My.instance_methods.size
#=> 64
my = My.new
puts my.methods.size
#=> 64
p (my.methods - My.instance_methods) - (My.instance_methods - my.methods)
#=> []

となり、Myクラスのinstance_methodsの返値と、Myクラスのインスタンスmyのmethodsの返値は全く同じになることが分かります。

インスタンスmyに特異メソッドを作る

def my.eigen_method
end

を定義してから、先ほどと同じ事をしてみます。

puts my.methods.size
#=> 65
p (my.methods - My.instance_methods) - (My.instance_methods - my.methods)
#=> [:eigen_method]

となり、my.methodsの返値に:eigen_methodが増えたことが分かります。

Object#methods

methods(include_inherited = true) -> [Symbol]


そのオブジェクトに対して呼び出せるメソッド名の一覧を返します。 このメソッドは public メソッドおよび protected メソッドの名前を返します。
ただし特別に、引数が偽の時は Object#singleton_methods(false) と同じになっています。
instance method Object#methods (Ruby 1.9.3)

確認してみます。

p my.methods(false)
#=> [:eigen_method]
p my.singleton_methods
#=> [:eigen_method]

Module#instance_methods

instance_methods(inherited_too = true) -> [Symbol]


そのモジュールで定義されている public および protected メソッド名 の一覧を配列で返します。
[PARAM] inherited_too:
false を指定するとそのモジュールで定義されているメソッドのみ返します。
instance method Module#instance_methods (Ruby 1.9.3)

これも確認してみましょう。

p My.instance_methods(false)
#=> [:my_method]
puts My.instance_methods.size
#=> 64
My.superclass.instance_methods.size
#=> 63
My.instance_methods - My.superclass.instance_methods
#=> [:my_method]

仲間のメソッドたち

Object#singleton_methodsは先ほど確認しました。なお、引数により、返値に継承した特異メソッドを含むか否かが変更されます。

singleton_methods(inherited_too = true) -> [Symbol]


そのオブジェクトに対して定義されている特異メソッド名 (public あるいは protected メソッド) の一覧を返します。
inherited_too が真のときは継承した特異メソッドを含みます。 継承した特異メソッドとは Object#extend によって追加された特異メソッドや、 self がクラスの場合はスーパークラスのクラスメソッド(Classのインスタンスの特異メソッド)などです。
instance method Object#singleton_methods (Ruby 1.9.3)

Object#public_methods以下はそれぞれpublic / private / protectedなメソッドを挙げてくるメソッドです。
Object#methodsの仲間

Module#instance_methodsの仲間

参考になる本

図書館で借りて2度ほど通読したのだけど、改めて読みたくなる。やはり手元にあるほうが良いだろうなぁ。

メタプログラミングRuby

メタプログラミングRuby