なかだです。 At Tue, 16 Oct 2001 02:30:12 +0900, Koji Arai <JCA02266 / nifty.ne.jp> wrote: > 見てみました。文字列を生成するメソッドと、self を加工するメ > ソッドがあるというわけですね。それはいいのですが、同じメソッ > ドが引数によって違う挙動を示すのは混乱を招くだけだと思うので > す。 1.7だとStringの方はだいたいself.classのインスタンスを返すよう になってます。
Index: array.c =================================================================== RCS file: /cvs/ruby/src/ruby/array.c,v retrieving revision 1.60 diff -u -2 -p -u -r1.60 array.c --- array.c 2001/10/05 06:30:42 1.60 +++ array.c 2001/10/15 23:02:35 @@ -87,8 +87,9 @@ rb_ary_s_alloc(klass) VALUE -rb_ary_new2(len) +rb_ary_new0(klass, len) + VALUE klass; long len; { - VALUE ary = rb_obj_alloc(rb_cArray); + VALUE ary = rb_obj_alloc(klass); if (len < 0) { @@ -111,4 +112,11 @@ rb_ary_new() } +VALUE +rb_ary_new2(len) + long len; +{ + return rb_ary_new0(rb_cArray, len); +} + #ifdef HAVE_STDARG_PROTOTYPES #include <stdarg.h> @@ -164,4 +172,12 @@ rb_ary_new4(n, elts) VALUE +rb_ary_new5(obj, len) + VALUE obj; + long len; +{ + return rb_ary_new0(rb_obj_class(obj), len); +} + +VALUE rb_assoc_new(car, cdr) VALUE car, cdr; @@ -420,10 +436,9 @@ rb_ary_subseq(ary, beg, len) len = 0; } - if (len == 0) return rb_ary_new2(0); + if (len == 0) return rb_ary_new5(ary, 0); - ary2 = rb_ary_new2(len); + ary2 = rb_ary_new5(ary, len); MEMCPY(RARRAY(ary2)->ptr, RARRAY(ary)->ptr+beg, VALUE, len); RARRAY(ary2)->len = len; - RBASIC(ary2)->klass = rb_obj_class(ary); return ary2; @@ -744,5 +759,5 @@ rb_ary_clone(ary) VALUE ary; { - VALUE clone = rb_ary_new2(RARRAY(ary)->len); + VALUE clone = rb_ary_new5(ary, RARRAY(ary)->len); CLONESETUP(clone, ary); @@ -756,7 +771,6 @@ rb_ary_dup(ary) VALUE ary; { - VALUE dup = rb_ary_new2(RARRAY(ary)->len); + VALUE dup = rb_ary_new5(ary, RARRAY(ary)->len); - OBJSETUP(dup, rb_obj_class(ary), T_ARRAY); MEMCPY(RARRAY(dup)->ptr, RARRAY(ary)->ptr, VALUE, RARRAY(ary)->len); RARRAY(dup)->len = RARRAY(ary)->len; @@ -1341,5 +1355,5 @@ rb_ary_times(ary, times) len *= RARRAY(ary)->len; - ary2 = rb_ary_new2(len); + ary2 = rb_ary_new5(ary, len); RARRAY(ary2)->len = len; @@ -1348,5 +1362,4 @@ rb_ary_times(ary, times) } OBJ_INFECT(ary2, ary); - RBASIC(ary2)->klass = rb_obj_class(ary); return ary2; Index: intern.h =================================================================== RCS file: /cvs/ruby/src/ruby/intern.h,v retrieving revision 1.66 diff -u -2 -p -u -r1.66 intern.h --- intern.h 2001/10/10 08:21:13 1.66 +++ intern.h 2001/10/15 23:03:55 @@ -21,8 +21,10 @@ void rb_mem_clear _((register VALUE*, register long)); VALUE rb_assoc_new _((VALUE, VALUE)); +VALUE rb_ary_new0 _((VALUE, long)); VALUE rb_ary_new _((void)); VALUE rb_ary_new2 _((long)); VALUE rb_ary_new3 __((long,...)); VALUE rb_ary_new4 _((long, VALUE *)); +VALUE rb_ary_new5 _((VALUE, long)); VALUE rb_ary_freeze _((VALUE)); VALUE rb_ary_aref _((int, VALUE*, VALUE));
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦