[#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:1147] Re: [Q] include module

From: matz@... (Yukihiro Matsumoto)
Date: 1996-11-29 17:11:20 UTC
List: ruby-list #1147
まつもと ゆきひろです.

In message "[ruby-list:1145] [Q] include module"
    on 96/11/29, sinara@blade.nagaokaut.ac.jp <sinara@blade.nagaokaut.ac.jp> writes:
|
|原です。質問です。
|
|【1】モジュールをインクルードしても、すでにある関数/メッソッド
|が再定義されないのはなぜでしょうか?

モジュールで定義されたものはインクルードされた順に自クラスと
スーパークラスの間に置かれます.ですから自クラスで定義した物
が常に優先です.その場合,モジュールで定義されたメソッドを
superで呼び出すことができます.

|【2】一群の関数 f1, f2, f3,... の定義を実行時に変えたい時に、い
|い方法はあるでしょうか?

There's more than one way to do that.ですが,前提によってい
ろいろだと思います.

一番簡単なのは

  case mode
  when 'A'
    def f1 ... end
    def f2 ... end
  when 'B'
  ...
  end

でしょうね.

|などとしたらうまくいくのではないかと思ったのですが、以前に既に
|f1, f2, f3,.. が定義されているとだめなんですよね。

includeを使う場合自クラスの定義の方が優先されますね.ですか
ら自クラスで定義されていないことを保証する必要がありますね.
undefを使ってもこれは解消できません.

# undefは継承を遡ってメソッドをキャンセルするので,includeし
# たメソッドもキャンセルしてしまうのです.

でも自クラスで(スーパークラスではなく)定義されていないという
のはそれほど厳しい制限ではないでしょう?

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

In This Thread