神代です.

On Mon, Mar 17, 2003 at 07:21:44PM +0900, nobu.nakada / nifty.ne.jp wrote:

| ruby_classを拡張ライブラリで使うっていうのは、どういう状況なん
| でしょうか。


RubyDCLのメイン開発者の堀之内さんから以下のようなお返事をいただき
ましたので引用します.


On Tue, 18 Mar 2003 01:18:03 +0900 
Takeshi Horinouchi <horinout / kurasc.kyoto-u.ac.jp> wrote:

> 以下のように、モジュール NumRu が既に定義されていれば
> それを使い、定義されていなければ新たに定義するためです。
> この部分、かつて rb_define_module を既存モジュールに適用す
> ると、追加でなく上書きとなってしまっていたことが原因です。
> ruby-list あたりで指摘した結果、上書きでなく追加に変更する
> とまつもとさんに返事を頂いたので、現在は必要なかろう
> と思います。
>
>     id = rb_intern("NumRu");
>     if (rb_const_defined_at(ruby_class, id)) {
>       mNumRu = rb_const_get(ruby_class, id);
>     }
>     if (mNumRu) {
>       if (TYPE(mNumRu) != T_MODULE) {
>           rb_raise(rb_eTypeError, "%s is not a module",
>                    rb_id2name(id));
>       }
>       if (rb_safe_level() >= 4) {
>           rb_raise(rb_eSecurityError, "extending module prohibited");
>       }
>     }
>     else {
>       mNumRu = rb_define_module("NumRu");
>     }
>
>
> 堀之内


[ruby-list:32914]からのスレッドでこの話題が議論されていたようです.

Ruby 1.6.8 の ChangeLog に

Fri Dec 14 00:16:06 2001  Yukihiro Matsumoto  <matz / ruby-lang.org>

        * class.c (rb_define_class): should return the existing class if
          the class is already defined and its superclass is ideintical to
          the specified superclass.

        * class.c (rb_define_class_under): ditto.

        * class.c (rb_define_module): should return the existing module if
          the module is already defined.

とありますので,修正済ですね.


-- 
神代  剛  /  こうしろ つよし  /  地球流体電脳倶楽部