我有一堂课:
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
)?
Answers:
您实际上想要的是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
对象本身的方法。
根据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]
要仅获取自己的方法,并排除继承的方法:
从实例内部:
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)