[前][次][番号順一覧][スレッド一覧][生データ]

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  ]