Feature #8811 ยป rb_ary_has_index.patch
| array.c | ||
|---|---|---|
|     return Qnil;
 | ||
| }
 | ||
|  | ||
| /*
 | ||
|  *  call-seq:
 | ||
|  *     ary.has_index?(idx)    -> true or false
 | ||
|  *     ary.index?(idx)        -> true or false
 | ||
|  *
 | ||
|  *  Returns <code>true</code> if the given index is present in <i>ary</i>.
 | ||
|  *
 | ||
|  *     a = [ "a", "b", "c" ]
 | ||
|  *     h.has_index?(0)    #=> true
 | ||
|  *     h.has_index?(2)    #=> true
 | ||
|  *     h.has_index?(3)    #=> false
 | ||
|  *     h.has_index?(-1)   #=> true
 | ||
|  *     h.has_index?(-4)   #=> false
 | ||
|  *
 | ||
|  */
 | ||
|  | ||
| static VALUE
 | ||
| rb_ary_has_index(VALUE ary, VALUE pos)
 | ||
| {
 | ||
|     VALUE val;
 | ||
|     long idx;
 | ||
|  | ||
|     idx = NUM2LONG(pos);
 | ||
|  | ||
|     if (idx < 0) {
 | ||
|        idx += RARRAY_LEN(ary);
 | ||
|     }
 | ||
|     if (idx < 0 || RARRAY_LEN(ary) <= idx) {
 | ||
|        return Qfalse;
 | ||
|     }
 | ||
|     return Qtrue;
 | ||
| }
 | ||
|  | ||
| VALUE
 | ||
| rb_ary_to_ary(VALUE obj)
 | ||
| {
 | ||
| ... | ... | |
|     rb_define_method(rb_cArray, "clear", rb_ary_clear, 0);
 | ||
|     rb_define_method(rb_cArray, "fill", rb_ary_fill, -1);
 | ||
|     rb_define_method(rb_cArray, "include?", rb_ary_includes, 1);
 | ||
|     rb_define_method(rb_cArray, "has_index?", rb_ary_has_index, 1);
 | ||
|     rb_define_method(rb_cArray, "index?", rb_ary_has_index, 1);
 | ||
|     rb_define_method(rb_cArray, "<=>", rb_ary_cmp, 1);
 | ||
|  | ||
|     rb_define_method(rb_cArray, "slice", rb_ary_aref, -1);
 | ||
| test/ruby/test_array.rb | ||
|---|---|---|
|     assert_equal(1, a.index(99) {|x| x == 'cat' })
 | ||
|   end
 | ||
|  | ||
|   def test_has_index
 | ||
|     a = @cls[ 'cat', 99, /a/, 99, @cls[ 1, 2, 3] ]
 | ||
|     assert(  a.has_index?(0))
 | ||
|     assert(  a.has_index?(4))
 | ||
|     assert(! a.has_index?(5))
 | ||
|     assert(  a.has_index?(-1))
 | ||
|     assert(  a.has_index?(-5))
 | ||
|     assert(! a.has_index?(-6))
 | ||
|   end
 | ||
|  | ||
|   def test_values_at
 | ||
|     a = @cls[*('a'..'j').to_a]
 | ||
|     assert_equal(@cls['a', 'c', 'e'], a.values_at(0, 2, 4))
 | ||