From: matz@... (Yukihiro Matsumoto) Date: 1999-02-15T15:36:18+09:00 Subject: [ruby-list:12077] Re: module in module まつもと ゆきひろです In message "[ruby-list:12062] module in module" on 99/02/13, TAKAHASHI Hitoshi 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 しておいた方が良い場合がありま したでしょうか? まつもと ゆきひろ /:|)