我可以检测到方法已被覆盖吗?

时间:2012-07-13 00:03:52

标签: ruby

假设这里有一些我不知道的任意库代码:

class Foo
  def hi
  end
end

class Bar < Foo
  def hi
  end
end

假设我有一些代码,我将Bar作为参数传递。

def check(x)
  do_something_with(x.method(:hi))
end

在上面的示例中,我是否可以知道x.hi(其中x引用Bar的实例)与Foo#hi不同?


根据Gareth的回答,这是我到目前为止所得到的:

def is_overridden?(method)
  name = method.name.to_sym
  return false if !method.owner.superclass.method_defined?(name)
  method.owner != method.owner.superclass.instance_method(name).owner
end

丑恶?华丽?

2 个答案:

答案 0 :(得分:10)

你可以这样做:

if x.method(:hi).owner == Foo

我远非成为Ruby专家;如果有人有比这更好的方法,我不会感到惊讶。

答案 1 :(得分:0)

有趣的问题!我想知道同样的问题。您可以重新打开Bar类,并检查Bar的查找路径中谁是已定义方法的祖先。

class Bar < Foo
  ancestors.each do |ancestor|
    puts ancestor if ancestor.instance_methods.include?(:hi)
  end
end