便利なのでは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:
Post a Comment