Supongamos que aquí hay un código de biblioteca arbitrario que no sé sobre: ¿Puedo detectar que un método ha sido anulado?
class Foo
def hi
end
end
class Bar < Foo
def hi
end
end
Y supongamos que tengo un poco de código donde me pasé Bar
como parámetro.
def check(x)
do_something_with(x.method(:hi))
end
En el ejemplo anterior, puedo saber que x.hi
(donde x
referencia a una instancia de Bar
) es diferente de Foo#hi
?
Sobre la base de la respuesta de Gareth, esto es lo que tengo hasta ahora:
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
horrible? ¿Maravilloso?
Si bien no es necesariamente relevante, tengo curiosidad por saber por qué quieres hacer esto. –
Además, parece que solo le importa "anular" con respecto a la herencia en lugar de redefinir un método existente en la misma clase? –