[#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:7985] [patch] Array#delete_at w/ minus value

From: EGUCHI Osamu <eguchi@...>
Date: 1999-10-12 04:00:39 UTC
List: ruby-dev #7985
えぐち@エスアンドイーです。

負のインデックスを Array の delete_at の引数に
使えるようにしてみました。

  a = [1, 2, 3]
  a.delete_at(-2)
  p a
   => [1, 3]

考えた範囲で、害は無いと思うのですが、どうでしょうか?

	えぐち

Index: array.c
===================================================================
RCS file: /usr/home/eguchi/cvs.netlab.co.jp//ruby/array.c,v
retrieving revision 1.2
diff -d -u -r1.2 array.c
--- array.c	1999/08/13 05:45:02	1.2
+++ array.c	1999/10/12 03:28:03
@@ -940,22 +940,19 @@
     VALUE ary;
     VALUE at;
 {
-    long i1, i2, pos;
+    long i, pos = NUM2LONG(at), len = RARRAY(ary)->len;
     VALUE del = Qnil;
 
+    if (pos >= len) return Qnil;
+    if (pos < 0) pos += len;
+    if (pos < 0) return Qnil;
+
     rb_ary_modify(ary);
-    pos = NUM2LONG(at);
-    for (i1 = i2 = 0; i1 < RARRAY(ary)->len; i1++) {
-	if (i1 == pos) {
-	    del = RARRAY(ary)->ptr[i1];
-	    continue;
-	}
-	if (i1 != i2) {
-	    RARRAY(ary)->ptr[i2] = RARRAY(ary)->ptr[i1];
-	}
-	i2++;
+    del = RARRAY(ary)->ptr[pos];
+    for (i = pos + 1; i < len; i++, pos++) {
+	RARRAY(ary)->ptr[pos] = RARRAY(ary)->ptr[i];
     }
-    RARRAY(ary)->len = i2;
+    RARRAY(ary)->len = pos;
 
     return del;
 }

In This Thread