前田です。

In message "[ruby-dev:1562] Re: monitor.rb"
石塚圭樹 <keiju / rational.com> 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は複数回行っても何もしないから
大丈夫そうですね。
# なんとなく気持ち悪い気もしますけど...。

-- 
前田 修吾