2015-12-19

rubyのメソッドの調査方法 Object#methodsが便利。

rubyでincludeとextendを理解するために、インプリされたメソッドの一覧を取得する場合に、どのメソッドを使っていいのか、毎回悩んでいたのでまとめてみる。


便利なのではmethodsかな。言うならば万能選手。
クラス、モジュールに対して使えばクラスメソッドを返すし、オブジェクトの場合はインスタンスメソッドを返す。falseを使うこともできる。

クラスメソッド狙い撃ちしたい場合は、singleton_method。反対にインスタンスメソッドを狙い撃ちしたい場合はinstance_methods。

repond_to?、method_defined?はあまり使わないかも。



module Test
  def test;end
  def self.test2;end #=>この書き方は意味がない
end

class Main
  extend Test
  def main; end
  def self.main2;end
end

#method_defined?
#クラスに対するインスタンスメソッドの有無を調べる
#publicなメソッド調査
Main.method_defined?(:main) # => true
Main.method_defined?(:main2) # => false
Main.method_defined?(:test) # => false
Main.method_defined?(:test2)  # => false
Main.new.respond_to?(:main) # => true
Main.new.respond_to?(:main2) # => false
Main.new.respond_to?(:test) #  => false
Main.new.respond_to?(:test2) # => false

#クラス、モジュールのインスタンスメソッドを返す
Main.instance_methods # => [:main, , , , ]
Main.instance_methods(false) # => [:main]

#レシーバがもつメソッドを返す。特異メソッドを含む
## クラス・メソッドを返す
Main.methods 
# >> [:main2, :test, :allocate, ...
## インスタンスメソッドを返す
Main.new.methods 
# >> [:main, :nil?, :===, ... 

#特異メソッドを返す.以下は同じ結果
Main.methods(false) 
Main.singleton_methods(false)
# >> [:main2]

No comments: