2012-06-24 17 views
10

をチェック最近、私はsuperキーワードは、現在のコンテキストで使用することができるかどうかを確認するために使用defined?オペレータといくつかの奇妙な行動に出くわしました。通常は正常に動作しますが、defined? superのチェックを小さなプログラミング用のメタプログラミングと組み合わせようとすると、予期せぬ結果が出ました。奇妙な行動?(スーパー)

それはので、ここで記述するために、次に示すために、簡単だ問題を説明するために蒸留例です。

class A; 
    def self.def_f!; 
    singleton_class.send(:define_method, :f) { defined? super } 
    end 
end 
class AA < A; end 

AAAクラスの両方が.def_f!クラスメソッドを持っている)

A.def_f! 

A.f # => nil 
AA.f # => nil 

A.fA.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

+3

Rubyのソースを調べたところ、本当のバグが見つかったと思います。 Rubyのbugtrackerに報告してください。 –

+1

あなたがそうした場合は、ここに問題のリンクを投稿することを忘れないでください! ':)' –

+1

@ NiklasB。完了:http://bugs.ruby-lang.org/issues/6644 – Alexis

答えて

2

@Niklasが正しかったので、この問題をRuby bugtrackerに報告し、バグを確認して修正しました:https://bugs.ruby-lang.org/issues/6644

私の知る限り理解してきたように、修正はルビー2.0.0に含まれます。

+0

報告とフォローアップをありがとう! –

1

うんdefine_methodといくつかの癖がありますこれはdefined?(super)の問題ではありませんが、define_methodの場合はそれ以上です。私はdefine_methodで、このような極端なケースに遭遇するたびに、私は通常はRubyのコードの文字列をeval'ing終わると、予想通り、それは常に働いて終わる、と述べました。それはこのように動作理由として

module M; 
    def def_f! 
    singleton_class.class_eval <<-RUBY 
     def f 
     defined?(super) 
     end 
    RUBY 
    end 
end 

class A; extend M; end 
class AA < A; end 

A.def_f! 

p A.f # => nil 
p AA.f # => nil 

AA.def_f! # define its own .f method in the AA class 

p AA.f # => "super" 
p A.f # => nil 

、私は多分私よりも多くを知っている誰かがチャイムができ、知っているRubyのソースとの十分な経験を積んではないよ。しかし、実用的な目的のために、文字列を評価することは、常に取り組んできました私のために。

+0

私はまだ問題が '?(super)'でより多くなると信じていますが、回避策に感謝します。 – Alexis