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