Ostatnio natknąłem się na dziwne zachowanie z operatorem defined?
używanym do sprawdzenia, czy słowo kluczowe super
może być użyte w obecnym kontekście. Zwykle działa dobrze, ale kiedy próbowałem połączyć test z metaprogramowaniem, otrzymałem niespodziewane wyniki.Dziwne zachowanie zdefiniowanego? (Super) sprawdzenia
Łatwiej pokazują następnie opisują więc o to przykład destylowaną w celu zilustrowania problemu:
class A;
def self.def_f!;
singleton_class.send(:define_method, :f) { defined? super }
end
end
class AA < A; end
(A
i AA
klas mają zarówno .def_f!
sposób klasę)
A.def_f!
A.f # => nil
AA.f # => nil
(A.f
nie ma żadnych super i wysyłek do A.f
, więc wszystko jest OK, ale ...)
AA.def_f! # define its own .f method in the AA class
AA.f # => "super"
A.f # => "super" # WHY???
Czy ktoś mógłby mi wytłumaczyć ostatnią linię? A.f
nie ma super metody, a następnie dlaczego zwraca "super"
zamiast nil
? Czy to błąd?
(próbowałem go w 1.9.2 i 1.9.3-same wyniki)
UPD: Otworzyłem bilet na bugtracker Ruby: http://bugs.ruby-lang.org/issues/6644
Po obejrzeniu źródeł Ruby, znalazłem tutaj prawdziwy błąd. Powinieneś zgłosić to do systemu śledzenia błędów Ruby. –
A jeśli to zrobisz, nie zapomnij opublikować linku do problemu tutaj! ':)' –
@NiklasB. Wykonano: http://bugs.ruby-lang.org/issues/6644 – Alexis