[ruby-list:493] Re: bugreports(Enum#find/find_all, ruby-mode.el) and Requests

From: matz@... (Yukihiro Matsumoto)
Date: 1996-09-11 02:22:24 UTC
List: ruby-list #493
まつもと ゆきひろです.

In message "[ruby-list:492] Re: bugreports(Enum#find/find_all, ruby-mode.el) and Requests"
    on 96/09/11, Yukihiro Matsumoto <matz@caelum.co.jp> writes:

||a = [1, 2, 3, 4]
||elm = a.find_all{|e|
||  e == 2 or e == 4
||}
||---
||Segmentation Falt
|
|こっちはバグです.簡単なタイプミスでした.

||4. Enum#max{...},min{...}
||
||Enumerableにはmax/minがありますが, sortと同じようにイテレータを受け付
||けるようにしてください.
|
|しました.

以上二つに付いてのパッチを流しておきます.

--- enum.c~	Wed Sep 11 11:11:22 1996
+++ enum.c	Wed Sep 11 01:25:31 1996
@@ -96,7 +96,7 @@
     VALUE tmp;
 
     tmp = ary_new();
-    rb_iterate(rb_each, obj, find_all_i, 0);
+    rb_iterate(rb_each, obj, find_all_i, tmp);
 
     return tmp;
 }
@@ -185,13 +185,28 @@
     }
 }
 
+static void
+min_ii(i, min)
+    VALUE i, *min;
+{
+    VALUE cmp;
+
+    if (NIL_P(*min))
+	*min = i;
+    else {
+	cmp = rb_yield(assoc_new(i, *min));
+	if (FIX2INT(cmp) < 0)
+	    *min = i;
+    }
+}
+
 static VALUE
 enum_min(obj)
     VALUE obj;
 {
     VALUE min = Qnil;
 
-    rb_iterate(rb_each, obj, min_i, &min);
+    rb_iterate(rb_each, obj, iterator_p()?min_ii:min_i, &min);
     return min;
 }
 
@@ -210,13 +225,28 @@
     }
 }
 
+static void
+max_ii(i, max)
+    VALUE i, *max;
+{
+    VALUE cmp;
+
+    if (NIL_P(*max))
+	*max = i;
+    else {
+	cmp = rb_yield(assoc_new(i, *max));
+	if (FIX2INT(cmp) > 0)
+	    *max = i;
+    }
+}
+
 static VALUE
 enum_max(obj)
     VALUE obj;
 {
     VALUE max = Qnil;
 
-    rb_iterate(rb_each, obj, max_i, &max);
+    rb_iterate(rb_each, obj, iterator_p()?max_ii:max_i, &max);
     return max;
 }
 

In This Thread

Prev Next