をチェック最近、私はsuper
キーワードは、現在のコンテキストで使用することができるかどうかを確認するために使用defined?
オペレータといくつかの奇妙な行動に出くわしました。通常は正常に動作しますが、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
A.f
へのスーパーやAA.f
派遣を持っていないので、すべての[OK]を、これまでに、しかし...)
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
Rubyのソースを調べたところ、本当のバグが見つかったと思います。 Rubyのbugtrackerに報告してください。 –
あなたがそうした場合は、ここに問題のリンクを投稿することを忘れないでください! ':)' –
@ NiklasB。完了:http://bugs.ruby-lang.org/issues/6644 – Alexis