私にはクラスがあります:
class TestClass
def method1
end
def method2
end
def method3
end
end
このクラスのメソッドのリスト(method1
、method2
、method3
)を取得するにはどうすればよいですか?
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"]
または、オブジェクトでmethods
(instance_methods
ではなく)を呼び出すことができます。
test_object = TestClass.new
test_object.methods.grep(/method1/) # => ["method1"]
TestClass.methods(false)
そのクラスのみに属するメソッドのみを取得します。
TestClass.instance_methods(false)
は、指定された例のメソッドを返します(TestClassのインスタンスメソッドであるため)。
TestClass.instance_methods
またはすべての継承されたメソッドなし
TestClass.instance_methods - Object.methods
(以前は「TestClass.methods-Object.methods」でした)
$ 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
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]