From: shugo@... (Shugo Maeda) Date: 1998-03-03T20:20:22+09:00 Subject: [ruby-dev:1570] Re: monitor.rb 前田です。 In message "[ruby-dev:1562] Re: monitor.rb" 石塚圭樹 wrote: |>newの引数が複数の時はdummyを作るところでArgumentErrorが起きると思います。 |>Stringを継承したクラスで試した時に気づきました。 | |ああ. なるほど. このパターンは実際には結構多いはずですね... ですね。 |反応しなくてすいません. メイルは読んでいたんですけどね. いえいえ。 最近メールを全部読むだけでも結構大変ですよね。 |>オブジェクトがインスタンス変数を持てるかどうか調べるのはinstance_evalで |>試せばよいのですが、クラスの場合はちょっと面倒です。 |>結局普通にクラス定義する時はnewをオーバーライドすることはないので、newを |>オーバーライドしているクラスはCで書かれたインスタンス変数を持てないクラス |>とみなすことにしてしまいました。 | |うーん. なかなか微妙ですね... 基本的には安全サイドになっているのですが... | |ただ, 通常includeするのは, クラス定義の頭で行なうので, 新規クラスでdef |newしていても, append_featureが呼ばれた段階ではnewはoverrideされていな |いと判断されてしまいますね. そうすると, Primitiveクラスのサブクラスの |場合問題がおきそうですね. newがすでにオーバーライドされているクラスをサブクラス化する場合は 継承されたクラスでsingleton_methodsを呼んでもnewがちゃんと入って いるので大丈夫なのではないでしょうか。 |案1 (snip) |2. initialize時にそのオブジェクト(self)がどっちのタイプか判別し, | extendする. extendにするのはコストがもったいないと思ったのですが、 |案2 (snip) |2. インスタンス生成(initialize)時にそのオブジェクト(self)がどっちのタ | イプか判別し, その時点で必要なモジュールをクラスにインクルードする. |# 何かダミーのモジュールが必要そう. これなら、 def initialize(*args) super type.include(MonitorMixin.extendable_module(self)) mon_initialize end みたいにすれば、includeは複数回行っても何もしないから 大丈夫そうですね。 # なんとなく気持ち悪い気もしますけど...。 -- 前田 修吾