From: Yukihiro Matsumoto Date: 2006-02-18T11:18:40+09:00 Subject: [ruby-dev:28337] constant look up order in CVS HEAD まつもと ゆきひろです [yarv-dev:912]からの転送です。 夕べのCVS HEADから定数の参照順序が変わりました。定数名が極端 に重複していない限り、あまり問題が起きることがないと思います。 問題が起きるのはもともとどの定数が参照されるか曖昧だった「危 険な」プログラムだと思います。 なにか不具合があったら教えて下さい。 --- From: Yukihiro Matsumoto Date: Fri, 17 Feb 2006 17:49:32 +0900 Subject: [yarv-dev:912] Re: cref with include module まつもと ゆきひろです 遅れた対応ですが。 In message "Re: [yarv-dev:797] Re: cref with include module" on Thu, 02 Feb 2006 04:27:00 +0900, SASADA Koichi writes: |module M | class C | end |end | |class C | include M | p C |end | |は M::C を出力しますが、 | |module M | class C | end |end | |module Foo | class C | include M | p C | end |end | |は Foo::C を出力します。 | | これは、「一個上」がObjectだったとき、見ないという仕様によりますが、こ |れは Object まで見ちゃってもいいように思うんですが、どうでしょうか。YARV |ではObjectまで見るので、前の例では::Cを出力します。 これは以前からの懸念であった定数の参照順序によるものです。で、 現在の順序は 自クラス→外側のクラス(トップレベルを除く)→スーパークラス の順です。ですから、上の二番目の例では外側にいるFooの方が includeされてスーパークラス扱いのMよりも先に参照されちゃうの で、Foo::Cが見えます。で、今日のパッチで1.9では 自クラス→スーパークラス(Objectを除く) →外側のクラス(トップを除く)→Object になりますので、両方ともM::Cを返すようになります。単純化しよ うと思ったけど、結局前より複雑になってしまいました。でも、外 側にあるクラスやモジュールの定数の優先度が高すぎるという問題 は解決しました。本当は、ルールを単純にするため * スーパークラスをObjectまで参照してから外側を見る * 外側のクラスは一階層しか見ない とかを考えたのですが、実際にやってみるといろいろと不都合があっ て上のようなルールになりました。とりあえず、今までのプログラ ムのほとんどは動作するようです。まあ、定数の名称重複なんて滅 多にないでしょうし、あまり大きな影響はないのかも。 まつもと ゆきひろ /:|)