web-dev-qa-db-ja.com

クラスのインスタンスメソッドのリストを取得する

私にはクラスがあります:

class TestClass
  def method1
  end

  def method2
  end

  def method3
  end
end

このクラスのメソッドのリスト(method1method2method3)を取得するにはどうすればよいですか?

92

TestClass自体ができることに興味がない限り、実際にはTestClass.instance_methodsが必要です。

class TestClass
  def method1
  end

  def method2
  end

  def method3
  end
end

TestClass.methods.grep(/method1/) # => []
TestClass.instance_methods.grep(/method1/) # => ["method1"]
TestClass.methods.grep(/new/) # => ["new"]

または、オブジェクトでmethodsinstance_methodsではなく)を呼び出すことができます。

test_object = TestClass.new
test_object.methods.grep(/method1/) # => ["method1"]
107
Andrew Grimm
TestClass.methods(false) 

そのクラスのみに属するメソッドのみを取得します。

TestClass.instance_methods(false)は、指定された例のメソッドを返します(TestClassのインスタンスメソッドであるため)。

106
Bijan
TestClass.instance_methods

またはすべての継承されたメソッドなし

TestClass.instance_methods - Object.methods

(以前は「TestClass.methods-Object.methods」でした)

35
Pavling

debugging または looksee のようなgemを使用して、より詳細なリスト(クラスを定義することで構造化されているなど)を取得できます。

6
J-_-L
$ irb --simple-Prompt

class TestClass
  def method1
  end

  def method2
  end

  def method3
  end
end

tc_list = TestClass.instance_methods(false)
#[:method1, :method2, :method3]
puts tc_list
#method1
#method2
#method3
5

Ruby Doc instance_methods によると

レシーバーのパブリックおよびプロテクトインスタンスメソッドの名前を含む配列を返します。モジュールの場合、これらはパブリックおよび保護されたメソッドです。クラスの場合、それらは(シングルトンではなく)インスタンスメソッドです。オプションのパラメーターがfalseの場合、祖先のメソッドは含まれません。公式のドキュメントの例を取り上げています。

module A
  def method1()  
    puts "method1 say hi"
  end
end
class B
  include A #mixin
  def method2()  
     puts "method2 say hi"
  end
end
class C < B #inheritance
  def method3() 
     puts "method3 say hi"
  end
end

出力を見てみましょう。

A.instance_methods(false)
  => [:method1]

A.instance_methods
  => [:method1]
B.instance_methods
 => [:method2, :method1, :nil?, :===, ...# ] # methods inherited from parent class, most important :method1 is also visible because we mix module A in class B

B.instance_methods(false)
  => [:method2]
C.instance_methods
  => [:method3, :method2, :method1, :nil?, :===, ...#] # same as above
C.instance_methods(false)
 => [:method3]
2