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の仲間
参考になる本
図書館で借りて2度ほど通読したのだけど、改めて読みたくなる。やはり手元にあるほうが良いだろうなぁ。
- 作者: Paolo Perrotta,角征典
- 出版社/メーカー: KADOKAWA/アスキー・メディアワークス
- 発売日: 2010/08/28
- メディア: 大型本
- 購入: 18人 クリック: 533回
- この商品を含むブログ (125件) を見る