這裏假設是一些任意的代碼庫,我不知道:我可以檢測到方法已被覆蓋嗎?
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
?
基於加雷思的答案,這是我到目前爲止有:
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
醜惡?華麗?
雖然它不一定相關,但我很好奇你爲什麼要這樣做。 – 2012-07-13 03:03:58
另外,它似乎只關心繼承方面的「重寫」,而不是在同一個類上重新定義現有方法? – 2012-07-13 03:07:17