もりきゅうです。

NISHIMATSU Takeshi <t-nissie / imr.tohoku.ac.jp> wrote:
> 下の例の★はどの条件に合致していると考えればよいのでしょうか.
> ★で直接参照できるので, ネストしたクラスの中からも
> 直接参照できそうだと考えてしまいました.
> 
> # incmod.rb
> module M
>   ConstM = "M"
> end
> class Parent
>   ConstP = "P"
>   include M
>   p ConstP        # => "P"
>   p M::ConstM     # => "M"
>   p ConstM        # => "M" ★

> end

>  自分で定義されたもの
>  その外側のクラスで定義されたもの
>  そのまた外側で定義されたもの(以下トップレベルまで続く、トップレベル含まない)
>  スーパークラスで定義されたもの
>  そのスーパークラスで定義されたもの(以下Objectまで続く、Object含まない)
合致するのは
  スーパークラスで定義されたもの
です。

スーパークラスってどこにあるの?
ParentのスーパークラスはObjectじゃないの?
ということになりますが、

Parent < Object のとき

class Parent
  include M
end

を実行すると

Parent < (M) < Object

になると考えてください。
M がかっこ書きなのは、M がクラスではないからですが、
定数参照のふるまいを考える上では、このようにクラスツリーに挟むとすっきりします。
Module#ancestors も試してみてください。

> ぼくはRubyのincludeを「梱包を解いてそこに置く」というかんじで
> 理解しています.
ということなので、

module M
  ConstM = "M"
end
class Parent
  ConstP = "P"
  include M
end

は

class Parent
  ConstP = "P"
  ConstM = "M"
end

と書くのと同等だと考えておられると思いますが、そうではないのです。

----
YOSHIDA Kazuhiro  moriq / moriq.com  http://www.moriq.com/