From c5827ca193babcfce745e429eb46dc4251ab4080 Mon Sep 17 00:00:00 2001 From: knu Date: Wed, 9 Apr 2008 11:53:15 +0000 Subject: * array.c (rb_ary_index, rb_ary_index): Array#index and #rindex take a block instead of an argument; backported from 1.9. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@15936 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- array.c | 80 ++++++++++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 55 insertions(+), 25 deletions(-) (limited to 'array.c') diff --git a/array.c b/array.c index 2d345dab5d..41b1224e4e 100644 --- a/array.c +++ b/array.c @@ -848,26 +848,41 @@ rb_ary_fetch(argc, argv, ary) /* * call-seq: - * array.index(obj) -> int or nil + * array.index(obj) -> int or nil + * array.index {|item| block} -> int or nil * - * Returns the index of the first object in self such that is - * == to obj. Returns nil if - * no match is found. + * Returns the index of the first object in self such that is + * == to obj. If a block is given instead of an + * argument, returns first object for which block is true. + * Returns nil if no match is found. * * a = [ "a", "b", "c" ] - * a.index("b") #=> 1 - * a.index("z") #=> nil + * a.index("b") #=> 1 + * a.index("z") #=> nil + * a.index{|x|x=="b"} #=> 1 */ static VALUE -rb_ary_index(ary, val) +rb_ary_index(argc, argv, ary) + int argc; + VALUE *argv; VALUE ary; - VALUE val; { + VALUE val; long i; - for (i=0; ilen; i++) { - if (rb_equal(RARRAY(ary)->ptr[i], val)) + if (argc == 0) { + RETURN_ENUMERATOR(ary, 0, 0); + for (i=0; i int or nil * - * Returns the index of the last object in array - * == to obj. Returns nil if - * no match is found. + * Returns the index of the last object in array + * == to obj. If a block is given instead of an + * argument, returns first object for which block is + * true. Returns nil if no match is found. * * a = [ "a", "b", "b", "b", "c" ] - * a.rindex("b") #=> 3 - * a.rindex("z") #=> nil + * a.rindex("b") #=> 3 + * a.rindex("z") #=> nil + * a.rindex{|x|x=="b"} #=> 3 */ static VALUE -rb_ary_rindex(ary, val) +rb_ary_rindex(argc, argv, ary) + int argc; + VALUE *argv; VALUE ary; - VALUE val; { - long i = RARRAY(ary)->len; + VALUE val; + long i = RARRAY_LEN(ary); - while (i--) { - if (i > RARRAY(ary)->len) { - i = RARRAY(ary)->len; - continue; + if (argc == 0) { + RETURN_ENUMERATOR(ary, 0, 0); + while (i--) { + if (RTEST(rb_yield(RARRAY_PTR(ary)[i]))) + return LONG2NUM(i); + if (i > RARRAY_LEN(ary)) { + i = RARRAY_LEN(ary); + } } - if (rb_equal(RARRAY(ary)->ptr[i], val)) + return Qnil; + } + rb_scan_args(argc, argv, "01", &val); + while (i--) { + if (rb_equal(RARRAY_PTR(ary)[i], val)) return LONG2NUM(i); + if (i > RARRAY_LEN(ary)) { + i = RARRAY_LEN(ary); + } } return Qnil; } @@ -3036,8 +3066,8 @@ Init_Array() rb_define_method(rb_cArray, "length", rb_ary_length, 0); rb_define_alias(rb_cArray, "size", "length"); rb_define_method(rb_cArray, "empty?", rb_ary_empty_p, 0); - rb_define_method(rb_cArray, "index", rb_ary_index, 1); - rb_define_method(rb_cArray, "rindex", rb_ary_rindex, 1); + rb_define_method(rb_cArray, "index", rb_ary_index, -1); + rb_define_method(rb_cArray, "rindex", rb_ary_rindex, -1); rb_define_method(rb_cArray, "indexes", rb_ary_indexes, -1); rb_define_method(rb_cArray, "indices", rb_ary_indexes, -1); rb_define_method(rb_cArray, "join", rb_ary_join_m, -1); -- cgit v1.2.3