まつもと ゆきひろです

In message "[ruby-list:2664] Re: help"
    on 97/04/07, sinara / blade.nagaokaut.ac.jp <sinara / blade.nagaokaut.ac.jp> writes:

|原です。

|一方、同じ名前のメッソッドを複数のモジュールで定義して、多
|重にインクルードできますよね。しかも上書きされる前のメッソ
|ッドの内容を忘れることはなく、何重にも super で呼び出せる。

そうです.モジュールはスタッカブルなんです.

In message "[ruby-list:2665] $_-module [Re: help ]"
    on 97/04/07, 石塚圭樹 <keiju / shljapan.co.jp> writes:

|けいじゅ@SHLジャパンです. 

|>   自クラス -> includeされたモジュール -> スーパークラス
|>
|>になっています.
|
|もっと正確には:
|
|自クラス -> includeされたモジュール -> スーパークラス -> スーパークラ
|スでincludeしたモジュール -> ...
|
|でいいんですよね?

もっと正確には

  自クラス -> 自クラスでincludeされたモジュール群 
	-> スーパークラス -> スーパークラスでincludeしたモジュール群 -> ...

です.includeするということはその時点でのモジュールの連鎖の
どこかにモジュールが存在することしか保証しないことに注意して
ください.

|やっと話しが元に戻って, 気になることについてですが, トップレベルでイン
|クルードされると method_missing()を利用した Proxyクラスなどは動作が変
|わることになりますね. つまり, $_-moduleがあったとして, それをトップ
|レベルでインクルードするとStringを利用したProxyクラスなどは動作が異なっ
|てくることになりますね. こういう現象は問題ある/ない??

「定義されているわけだからmethod_missingが呼ばれない」という
問題ですね.これはなかなかむずかしい問題をはらんでいますね.
現時点では「注意して使ってください」としかいえないですけど.

可能な対応は

  * 自分の責任で気を付けてもらう
  * main.includeではprivateメソッドだけしかincludeしないよう
    にする.
  * private methodの名前空間をpublic methodの名前空間と分離
    する.
  * 別の名前空間を導入する

などが考えられます.後ろのものほど大げさになるわけですが,個
人的にはあまり大げさにはしたくないなあと思っています.

				まつもと ゆきひろ /:|)