mxg*_*grn 6 ruby metaprogramming
说,我有以下两个类:
class A
def a_method
end
end
class B < A
end
Run Code Online (Sandbox Code Playgroud)
是否有可能从(的实例)类乙内检测方法a_method是仅在超类中所定义,因此不被覆盖在乙?
更新:解决方案
虽然我已经将Chuck的答案标记为"已接受",但后来Paolo Perrota让我意识到解决方案显然可以更简单,并且它可能也适用于早期版本的Ruby.
检测B中是否覆盖了"a_method":
B.instance_methods(false).include?("a_method")
Run Code Online (Sandbox Code Playgroud)
对于类方法,我们使用singleton_methods类似的方法:
B.singleton_methods(false).include?("a_class_method")
Run Code Online (Sandbox Code Playgroud)
如果您使用的是Ruby 1.8.7或更高版本,那么使用Method#owner/ 很容易UnboundMethod#owner.
class Module
def implements_instance_method(method_name)
instance_method(method_name).owner == self
rescue NameError
false
end
end
Run Code Online (Sandbox Code Playgroud)