[#28337] constant look up order in CVS HEAD — Yukihiro Matsumoto <matz@...>

まつもと ゆきひろです

15 messages 2006/02/18
[#28338] Re: constant look up order in CVS HEAD — Tanaka Akira <akr@...17n.org> 2006/02/19

In article <1140229116.805371.31930.nullmailer@x31.priv.netlab.jp>,

[#28341] Re: constant look up order in CVS HEAD — GOTOU Yuuzou <gotoyuzo@...> 2006/02/19

In message <87lkw8xfay.fsf@m17n.org>,

[#28342] Re: constant look up order in CVS HEAD — Yukihiro Matsumoto <matz@...> 2006/02/19

まつもと ゆきひろです

[ruby-dev:28337] constant look up order in CVS HEAD

From: Yukihiro Matsumoto <matz@...>
Date: 2006-02-18 02:18:40 UTC
List: ruby-dev #28337
まつもと ゆきひろです

[yarv-dev:912]からの転送です。

夕べのCVS HEADから定数の参照順序が変わりました。定数名が極端
に重複していない限り、あまり問題が起きることがないと思います。
問題が起きるのはもともとどの定数が参照されるか曖昧だった「危
険な」プログラムだと思います。

なにか不具合があったら教えて下さい。

---
From: Yukihiro Matsumoto <matz ruby-lang.org>
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 <ko1 atdot.net> 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まで参照してから外側を見る
  * 外側のクラスは一階層しか見ない

とかを考えたのですが、実際にやってみるといろいろと不都合があっ
て上のようなルールになりました。とりあえず、今までのプログラ
ムのほとんどは動作するようです。まあ、定数の名称重複なんて滅
多にないでしょうし、あまり大きな影響はないのかも。

                                まつもと ゆきひろ /:|)

In This Thread

Prev Next