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

In [ruby-dev :01584 ] the message: "[ruby-dev:1584] Re: [BUG]
String.dup ", on Mar/04 18:36(JST) Yukihiro Matsumoto writes:

>まつもと ゆきひろです

>|最初に石塚さんがおっしゃっていたように、
>|
>|Object --- Primitive -+- Array
>|                      |
>|                      +- Hash
>|                      .
>|                      .
>|                      .
>|                      +- Data
>|
>|としておいて、data_object_allocはDataのサブクラスしか受けつけ
>|ないようにするというのはどうでしょう。
>
>その場合Floatってどうしますか? ComplexとかあるのでNumericを
>Floatのサブクラスにはできませんし,NumericとFloatの間に
>Primitiveをはさむ,というのも難しい話でしょう.

そうですね. クラスにするのはまずいですね... Primitiveをモジュールにす
ればこの問題は解決すると思います.

           Primitive--+
                      |
Object --- Numeric -+-+- Float
                    |
                    +- Complex     

というように. 

>世の中にある全部の拡張モジュールを書き換える必要があるわけで
>すからできるだけAPIは変えたくないんですよねえ.

この問題は解決してないですよね...

# でも, 本来クラスが持つべき情報を持っていないところに問題があると思い
# ますけどね. 

現在オブジェクトに構造の情報が付加されるのは,

    OBJSETUP(obj, klass, type_id);

のところですよね? このマクロ内で, 

  klass->type_id != type_id

だったら例外を発生させるというのはどうでしょう? 普通, type_idが異なっ
ていたら, オブジェクトの構造に互換性がないと思って良いとおもうのですが...

ただ, T_CLASS, T_ICLASS, T_MODULEのようにデータ互換性のあるクラスには
対応できていませんし, T_DATAの場合, 一致しても参照している構造体に互換
性があるとは限りませんし...

あと, newの時は良いとして他のときはどうなるかわかりませんし...



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