Últimamente me encontré con un comportamiento extraño con el operador defined?
utilizado para comprobar si super
palabra clave puede ser utilizado en el contexto actual. Normalmente funciona bien, pero cuando traté de combinar la comprobación defined? super
con un poco de metaprogramación, me dio resultados inesperados.extraño comportamiento de definido? (Super) comprobar
Es más fácil para mostrar a continuación, para describir, por lo que aquí es un ejemplo destilada para ilustrar el problema:
class A;
def self.def_f!;
singleton_class.send(:define_method, :f) { defined? super }
end
end
class AA < A; end
(A
y AA
clases ambos tienen .def_f!
método de clase)
A.def_f!
A.f # => nil
AA.f # => nil
(A.f
no tiene envíos súper y AA.f
a A.f
, entonces todo está bien hasta ahora, pero ...)
AA.def_f! # define its own .f method in the AA class
AA.f # => "super"
A.f # => "super" # WHY???
¿Alguien podría explicarme la última línea? A.f
no tiene un método estupendo, ¿por qué devuelve "super"
en lugar de nil
? ¿Es un error?
(Lo he probado en 1.9.2 y 1.9.3 del mismo resultados)
UPD: me abrió un billete en el bugtracker Ruby: http://bugs.ruby-lang.org/issues/6644
Después de mirar las fuentes de Ruby, creo que encontraste un error real aquí. Debes informarlo al rastreador de errores de Ruby. –
Y si lo hace, ¡no olvide poner un enlace al problema aquí! ':)' –
@NiklasB. Hecho: http://bugs.ruby-lang.org/issues/6644 – Alexis