假设这里有一些我不知道的任意库代码:
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
丑恶?华丽?
答案 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