В последнее время я столкнулся с каким-то странным поведением с оператором defined?
, используемым для проверки того, можно ли использовать ключевое слово super
в текущем контексте. Обычно он работает нормально, но когда я попытался объединить проверку defined? super
с крошечным метапрограммированием, это дало мне неожиданные результаты.
Легче показать, чтобы потом описать, так что вот пример, иллюстрирующий проблему:
class A;
def self.def_f!;
singleton_class.send(:define_method, :f) { defined? super }
end
end
class AA < A; end
(A
и AA
классы имеют метод класса .def_f!
)
A.def_f!
A.f # => nil
AA.f # => nil
(A.f
не имеет супер и AA.f
отправляет на A.f
, поэтому все ОК до сих пор, но...)
AA.def_f! # define its own .f method in the AA class
AA.f # => "super"
A.f # => "super" # WHY???
Может ли кто-нибудь объяснить мне последнюю строку? A.f
не имеет супер-метода, то почему он возвращает "super"
вместо nil
? Это ошибка?
(я пробовал его в 1.9.2 и 1.9.3-такие же результаты)
UPD: Я открыл билет на багтрекере Ruby: http://bugs.ruby-lang.org/issues/6644