けいじゅ@日本ラショナルソフトウェアです.

話が複雑になっているのでruby-devに引っ越します.

In [ruby-list :06880 ] the message: "[ruby-list:6880] Re: monitor.rb
", on Mar/02 17:44(JST) Shugo Maeda writes:

>前田です。
>
>|>あと、Sync_m.includable_moduleでNameErrorだけでなくArgumentErrorも
>|>rescueした方がよいのではないでしょうか。
>|
>|そうなんですか? 私も全パターンを調べたわけではないので... 
>
>newの引数が複数の時はdummyを作るところでArgumentErrorが起きると思います。
>Stringを継承したクラスで試した時に気づきました。

ああ. なるほど. このパターンは実際には結構多いはずですね...

>あと、sync.rbでappend_featuresがextend_classになってます。
># たしか石塚さんがクラスを引数に取るとは限らないから名前を変えた
># 方がいいとおしゃっていたような(^^;

反応しなくてすいません. メイルは読んでいたんですけどね.

>|>monitor.rbでは特異メソッドにnewが含まれている時はPrimitiveなクラスと
>|>みなすことにしました。
>|
>|Primitiveなクラスかどうかが問題なのではなくて, インスタンス変数が作れ
>|るかが問題だとは思うのですが...
>|
>|# そのうち, primitiveなクラスでもインスタンス変数が作れるようになるか
>|# も知れないし(^^;;;
>
>そうですね(^^;

>クラスがインスタンス変数を持てるかどうか調べるメソッドがあると便利で
>すね。

たしかに. あると便利かなとも思いますが, APIとして用意するのははばかれ
るのかな...

>オブジェクトがインスタンス変数を持てるかどうか調べるのはinstance_evalで
>試せばよいのですが、クラスの場合はちょっと面倒です。
>結局普通にクラス定義する時はnewをオーバーライドすることはないので、newを
>オーバーライドしているクラスはCで書かれたインスタンス変数を持てないクラス
>とみなすことにしてしまいました。

うーん. なかなか微妙ですね... 基本的には安全サイドになっているのですが...

ただ, 通常includeするのは, クラス定義の頭で行なうので, 新規クラスでdef
newしていても, append_featureが呼ばれた段階ではnewはoverrideされていな
いと判断されてしまいますね. そうすると, Primitiveクラスのサブクラスの
場合問題がおきそうですね.

こういうのはどうでしょう?

案1
1. append_feature で実際にインクルードするモジュールの判別を行なったい
   るが, これをやめる(やめなくともよいけど).
2. initialize時にそのオブジェクト(self)がどっちのタイプか判別し,
   extendする.

案2
1. append_feature で実際にインクルードするモジュールの判別を行なったい
   るが, これをやめる(やめなくともよいけど).
2. インスタンス生成(initialize)時にそのオブジェクト(self)がどっちのタ
   イプか判別し, その時点で必要なモジュールをクラスにインクルードする.
# 何かダミーのモジュールが必要そう.

ちょっときついなあ... instance変数が付加可能かどうか判別できるメソッド
が欲しいですね.

__
................................石塚 圭樹@日本ラショナルソフトェア...
----------------------------------->> e-mail: keiju / rational.com <<---