私はクラスを持っています:
class TestClass
def method1
end
def method2
end
def method3
end
end
どのように私は(このクラスでは、私のメソッドのリストを取得することができmethod1
、method2
、method3
)?
私はクラスを持っています:
class TestClass
def method1
end
def method2
end
def method3
end
end
どのように私は(このクラスでは、私のメソッドのリストを取得することができmethod1
、method2
、method3
)?
回答:
それ自体ができることにTestClass.instance_methods
興味がない限り、あなたは実際にを望みTestClass
ます。
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"]
print TestClass.new.instance_methods
、このエラーが発生しますmy_class.rb:10:in <main>: undefined method instance_methods for #<TestClass:0x96b9d20> (NoMethodError)
TestClass.new.methods
。多分「それ」は私の答えがあいまいだった。
[:method1]
代わりに得るでしょう。
TestClass.methods(false)
そのクラスにのみ属するメソッドのみを取得します。
TestClass.instance_methods(false)
指定された例からメソッドを返します(それらはTestClassのインスタンスメソッドであるため)。
TestClass.instance_methods
またはすべての継承されたメソッドなし
TestClass.instance_methods - Object.methods
(「TestClass.methods-Object.methods」でした)
TestClass.methods(false)
。
TestClass.methods(false)
は空を返します
method1
、method2
またはmethod3
それらはの方法であるように、インスタンスのクラスののではないメソッドTestClass
オブジェクト自体。
$ 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によると
レシーバーのパブリックおよび保護されたインスタンスメソッドの名前を含む配列を返します。モジュールの場合、これらはpublicおよびprotectedメソッドです。クラスの場合、これらはインスタンス(シングルトンではない)メソッドです。オプションのパラメーターが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]
独自のメソッドのみを取得し、継承されたメソッドを除外するには:
インスタンス内から:
self.methods - self.class.superclass.instance_methods
外から:
TestClass.instance_methods - TestClass.superclass.instance_methods
クラスに追加します。
class TestClass
class << self
def own_methods
self.instance_methods - self.superclass.instance_methods
end
end
end
TestClass.own_methods
=> [:method1, :method2, method3]
(Ruby 2.6.xを使用)