最近、キーワードが現在のコンテキストで使用できる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