なかだです。

At Mon, 22 Dec 2003 19:35:25 +0900,
Tanaka Akira wrote:
> % ruby -ve 'Array.dup.new'
> ruby 1.8.1 (2003-12-22) [i686-linux]
> -e:1:in `new': allocator undefined for #<Class:0x401be394> (NoMethodError)
>         from -e:1
> 
> というように、dup した Array のインスタンスが生成できないようです。

cloneと違ってdupでは特異メソッドをコピーしないからですが、実際
のところ、クラス/モジュールメソッドもコピーしないと使い途ないで
しょう。


Index: class.c =================================================================== RCS file: /cvs/ruby/src/ruby/class.c,v retrieving revision 1.79 diff -u -2 -p -d -r1.79 class.c --- class.c 21 Dec 2003 08:29:06 -0000 1.79 +++ class.c 22 Dec 2003 11:17:02 -0000 @@ -64,4 +64,7 @@ rb_mod_init_copy(clone, orig) { rb_obj_init_copy(clone, orig); + if (!FL_TEST(CLASS_OF(clone), FL_SINGLETON)) { + RBASIC(clone)->klass = rb_singleton_class_clone(orig); + } RCLASS(clone)->super = RCLASS(orig)->super; if (RCLASS(orig)->iv_tbl) { Index: object.c =================================================================== RCS file: /cvs/ruby/src/ruby/object.c,v retrieving revision 1.133 diff -u -2 -p -d -r1.133 object.c --- object.c 21 Dec 2003 08:29:06 -0000 1.133 +++ object.c 22 Dec 2003 11:07:50 -0000 @@ -1663,4 +1663,5 @@ Init_Object() rb_define_method(rb_cClass, "new", rb_class_new_instance, -1); rb_define_method(rb_cClass, "initialize", rb_class_initialize, -1); + rb_define_method(rb_cClass, "initialize_copy", rb_class_init_copy, 1); rb_define_method(rb_cClass, "superclass", rb_class_superclass, 0); rb_define_alloc_func(rb_cClass, rb_class_s_alloc);
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦