From: EGUCHI Osamu Date: 1999-10-17T00:55:08+09:00 Subject: [ruby-dev:8037] no bang method always returned unique? えぐち@エスアンドイーです。 前回の、配列の変更未遂の場合の変更検査のパッチに 紛れ込んでいた。 % cat no-bang.rb a = [] b = a.sort p a.equal? b a = [ 1 ] b = a.sort p a.equal? b % ruby no-bang.rb → true false の話題ですが、 Array#uniq Array#compact Array#flatten も対象でした。 結局、至ってシンプルに static VALUE rb_ary_XXX(ary) VALUE ary; { ary = rb_ary_dup(ary); rb_ary_XXX_bang(ary); return ary; } としました。 また、length == 0 の 配列の sort が変更検査を 免れていたので、これも上記の要領で変更しました。 えぐち Index: array.c =================================================================== RCS file: /usr/home/eguchi/cvs.netlab.co.jp//ruby/array.c,v retrieving revision 1.4 diff -d -u -4 -r1.4 array.c --- array.c 1999/10/16 10:33:05 1.4 +++ array.c 1999/10/16 12:57:53 @@ -926,10 +926,10 @@ rb_ary_sort(ary) VALUE ary; { ary = rb_ary_dup(ary); - if (RARRAY(ary)->len == 0) return ary; - return rb_ary_sort_bang(ary); + rb_ary_sort_bang(ary); + return ary; } VALUE rb_ary_delete(ary, item) @@ -1360,12 +1360,11 @@ static VALUE rb_ary_uniq(ary) VALUE ary; { - VALUE v = rb_ary_uniq_bang(rb_ary_dup(ary)); - - if (NIL_P(v)) return ary; - return v; + ary = rb_ary_dup(ary); + rb_ary_uniq_bang(ary); + return ary; } static VALUE rb_ary_compact_bang(ary) @@ -1392,12 +1391,11 @@ static VALUE rb_ary_compact(ary) VALUE ary; { - VALUE v = rb_ary_compact_bang(rb_ary_dup(ary)); - - if (NIL_P(v)) return ary; - return v; + ary = rb_ary_dup(ary); + rb_ary_compact_bang(ary); + return ary; } static VALUE rb_ary_nitems(ary) @@ -1437,12 +1435,11 @@ static VALUE rb_ary_flatten(ary) VALUE ary; { - VALUE v = rb_ary_flatten_bang(rb_ary_dup(ary)); - - if (NIL_P(v)) return ary; - return v; + ary = rb_ary_dup(ary); + rb_ary_flatten_bang(ary); + return ary; } void Init_Array()