[#7968] array .{first, last, at} — Kazunori NISHI <kazunori@...>

西@九大です。

25 messages 1999/10/07
[#7969] Re: array .{first, last, at} — nobu.nakada@... 1999/10/07

なかだです。

[#7983] Re: array .{first, last, at} — Kazunori NISHI <kazunori@...> 1999/10/12

西@九大です。

[#7984] Re: array .{first, last, at} — matz@... (Yukihiro Matsumoto) 1999/10/12

まつもと ゆきひろです

[#7985] [patch] Array#delete_at w/ minus value — EGUCHI Osamu <eguchi@...> 1999/10/12

えぐち@エスアンドイーです。

[ruby-dev:8037] no bang method always returned unique?

From: EGUCHI Osamu <eguchi@...>
Date: 1999-10-16 15:55:08 UTC
List: ruby-dev #8037
えぐち@エスアンドイーです。

前回の、配列の変更未遂の場合の変更検査のパッチに
紛れ込んでいた。

   % 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()

In This Thread