まつもと ゆきひろです

In message "[ruby-list:12062] module in module"
    on 99/02/13, TAKAHASHI Hitoshi <thitoshi / ne.scphys.kyoto-u.ac.jp> writes:

|  初めて参加する高橋と申します。よろしくお願いします。

よろしく.

|module Const
|  CONST = 1
|end
|
|module MainModule
|  include Const
|  module SubModule
|    def const
|      p CONST
|    end
|  end
|end
|
|(以下同じ)
|
|とすると、Uninitialized constant CONST (NameError) と怒られてしまいます。

MainModuleでConstをインクルードしてもそれはSubModuleには引き
継がれないからです.MainModuleとSubModuleには継承関係はあり
ませんから.

|さらに分からないのは、

|include MainModule
|include SubModule
|
|const
|
|とやると、今度はどちらでもちゃんと 1 を出力してくれることです。
|これは何故なんでしょうか?

トップレベルでincludeするとObjectクラスにincludeすることにな
りますが,このObjectクラスはすべてのクラスのスーパークラスな
ので,どこからでも参照できる定数を定義したことになるからです.

|  そもそも、module 内で module を定義するメリットって何でしょう?

名前空間の分離が大きな目的ですね.

|関連する method をひとまとめにするというなら、
|別々に定義するのと変わらないですよね?

ま,そうですね.モジュールを使って分離するか,長い名前を使っ
て分離するかはかなり好みの問題のように思います.

|# なんでこんなこと聞くかというと、TkBalloon クラスを自作してたら
|overrideredirect のところで Uninitialized constant None と
|怒られたからなんです。

Tk::WmはTkCommを既にincludeしているクラスにincludeして使うこ
とを想定していました.TkBalloonクラスでのWmの使い方によりま
すが,明示的に include TkComm しておいた方が良い場合がありま
したでしょうか?
                                まつもと ゆきひろ /:|)