Странное поведение проверки define?(super)

Недавно я столкнулся с каким-то странным поведением оператора 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

10
задан Alexis 25 June 2012 в 12:30
поделиться