From: sinara@... Date: 1996-12-01T02:48:39+09:00 Subject: [ruby-list:1151] Re: [Q] include module 原です。 > まつもと ゆきひろです. > |【1】モジュールをインクルードしても、すでにある関数/メッソッド > |が再定義されないのはなぜでしょうか? > > モジュールで定義されたものはインクルードされた順に自クラスと > スーパークラスの間に置かれます.ですから自クラスで定義した物 > が常に優先です.その場合,モジュールで定義されたメソッドを > superで呼び出すことができます. これでよく分かりました。Mixin を「(さらに)定義を取り込む」もの とかってに理解していました。ちがうんですね。 class A; end module B; end class C < A; include B; end は、 A ---> C -+-> | B ではなくて、 A -+-> C ---> | B なんですね。 思い出しましたが、Mixin については、マニュアルにもチュートリアルに も言葉は出てくるが、例がありません。単に class 定義の中で include するのだと気づくまでに時間がかかりました。^^; > |【2】一群の関数 f1, f2, f3,... の定義を実行時に変えたい時に、い > |い方法はあるでしょうか? > 前提によっていろいろだと思います. すいません。私の前提では、各関数のコードが大きく、また切替える mode も段々増えてきそうなので、 > case mode > when 'A' > def f1 ... end > def f2 ... end > when 'B' > ... > end と書くのはちょっとつらかったのです。できれば、定義の集まりをプログ ラムファイルの先頭の方に持ってきたいところなんです。 > includeを使う場合自クラスの定義の方が優先されますね.ですか > ら自クラスで定義されていないことを保証する必要がありますね. > undefを使ってもこれは解消できません. > でも自クラスで(スーパークラスではなく)定義されていないという > のはそれほど厳しい制限ではないでしょう? そうですね。私は、デフォルトの関数を定義しておいて、後で場合に 応じて再定義することを考えていました。しかし、これはデフォルト をスーパークラスに置くか、デフォルトもモジュールとして定義して おけば解決するわけですね。なるほど。 ---===-=-=-=-=-=-=-=-=======--=-=-=-==-=-===-=-=-=-=-=-=--=-==-=-- Shin-ichro Hara(Nagaoka Univ.of Tech.)