[#1058] ruby 0.99.3-961119 available — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです.

19 messages 1996/11/19
[#1059] segm fault (Re ruby 0.99.3-961119 available) — sinara@... 1996/11/19

原です。

[ruby-list:1151] Re: [Q] include module

From: sinara@...
Date: 1996-11-30 17:48:39 UTC
List: ruby-list #1151
原です。

> まつもと ゆきひろです.

> |【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.)

In This Thread