Недавно я столкнулся с каким-то странным поведением оператора defined?
, используемого для проверки того, можно ли использовать ключевое слово super
в текущем контексте. Обычно это работает нормально, но когда я пытался совместить определил? 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
( Af
не имеет super и AA.f
отправляет в Af
, так что пока все в порядке, но... )
AA.def_f! # define its own .f method in the AA class
AA.f # => "super"
A.f # => "super" # WHY???
Может ли кто-нибудь объяснить мне последнюю строчку? A.f
не имеет метода super, тогда почему он возвращает "super"
вместо nil
? Это ошибка?
(Пробовал в 1.9.2 и 1.9.3 — результат тот же)
UPD:Я открыл тикет на багтрекере Ruby: http://bugs.ruby-lang.org /issues/6644