なかだです。

At Sat, 16 Jun 2001 05:29:58 +0900,
IKEGAMI Daisuke <daisu-ik / is.aist-nara.ac.jp> wrote:
> module A
>   class A
>   end
> end
> 
> include A
> A.new # => undefined method `new' for A:Module (NameError)

  これは include した ::A の持つ A::A よりも、同じスコープで直
接見える ::A の方が優先されるからです。

> module A
>   class A
>   end
> end
> 
> class B
>   include A
>   attr_reader :a
>   def initialize
>     @a = A.new
>   end
> end
> b = B.new # => succeed
> p b.a     # => <A::A:ruby's internal symbol>

  こちらは module A は class B の外部にある名前なので、include
した名前よりもさらに優先度は下がります。include した時点では外
部の ::A しか見えませんが、それ以降では A::A が見えますから。

  やや正確さに欠けますが、検索順序は
1) 現在のスコープから外部のスコープへ。
2) あるスコープ内では現在の class から super class へ、もしくは
   現在の module から include した module へ。
3) ある class/module 内では直接定義されたものから include した
   ものへ。

> A::A なんてふつうつくらねーよという声が聞こえてきそうだ…

  なくはないと思いますが。

-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦