もりきゅうです。 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/