[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;
}