yarv-dev:912
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まで参照してから外側を見る * 外側のクラスは一階層しか見ない とかを考えたのですが、実際にやってみるといろいろと不都合があっ て上のようなルールになりました。とりあえず、今までのプログラ ムのほとんどは動作するようです。まあ、定数の名称重複なんて滅 多にないでしょうし、あまり大きな影響はないのかも。 まつもと ゆきひろ /:|) -- ML: yarv-dev quickml.atdot.net 使い方: http://www.atdot.net/~ko1/quickml
773 2006-01-08 12:32 [ko1 atdot.net ] cref with include module 774 2006-01-08 19:52 ┗[matz ruby-lang.org ] 775 2006-01-09 01:47 ┗[ko1 atdot.net ] 776 2006-01-09 11:04 ┗[matz ruby-lang.org ] 797 2006-02-02 04:27 ┗[ko1 atdot.net ] -> 912 2006-02-17 17:49 ┗[matz ruby-lang.org ]