检测到方法未被覆盖

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)

Chu*_*uck 7

如果您使用的是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)