public Method

Array.slice(...)

array[index]                 obj      or nil
array[start, length]         an_array or nil
array[range]                 an_array or nil
array.slice(index)           obj      or nil
array.slice(start, length)   an_array or nil
array.slice(range)           an_array or nil

Element Reference—Returns the element at index,

or returns a subarray starting at _start_ and
continuing for _length_ elements, or returns a subarray
specified by _range_.
Negative indices count backward from the end of the
array (-1 is the last element). Returns nil if the index
(or starting index) are out of range.

   a = [ "a", "b", "c", "d", "e" ]
   a[2] +  a[0] + a[1]    #=> "cab"
   a[6]                   #=> nil
   a[1, 2]                #=> [ "b", "c" ]
   a[1..3]                #=> [ "b", "c", "d" ]
   a[4..7]                #=> [ "e" ]
   a[6..10]               #=> nil
   a[-3, 3]               #=> [ "c", "d", "e" ]

special cases

a[5]                   #=> nil
a[5, 1]                #=> []
a[5..10]               #=> []

Source Code

/* 
*  call-seq:
*     array[index]                -> obj      or nil
*     array[start, length]        -> an_array or nil
*     array[range]                -> an_array or nil
*     array.slice(index)          -> obj      or nil
*     array.slice(start, length)  -> an_array or nil
*     array.slice(range)          -> an_array or nil
*
*  Element Reference---Returns the element at _index_,
*  or returns a subarray starting at _start_ and
*  continuing for _length_ elements, or returns a subarray
*  specified by _range_.
*  Negative indices count backward from the end of the
*  array (-1 is the last element). Returns nil if the index
*  (or starting index) are out of range.
*
*     a = [ "a", "b", "c", "d", "e" ]
*     a[2] +  a[0] + a[1]    #=> "cab"
*     a[6]                   #=> nil
*     a[1, 2]                #=> [ "b", "c" ]
*     a[1..3]                #=> [ "b", "c", "d" ]
*     a[4..7]                #=> [ "e" ]
*     a[6..10]               #=> nil
*     a[-3, 3]               #=> [ "c", "d", "e" ]
*     # special cases
*     a[5]                   #=> nil
*     a[5, 1]                #=> []
*     a[5..10]               #=> []
*
*/

VALUE
rb_ary_aref(argc, argv, ary)
   int argc;
   VALUE *argv;
   VALUE ary;
{
   VALUE arg;
   long beg, len;

   if (argc == 2) {
       if (SYMBOL_P(argv[0])) {
           rb_raise(rb_eTypeError, "Symbol as array index");
       }
       beg = NUM2LONG(argv[0]);
       len = NUM2LONG(argv[1]);
       if (beg < 0) {
           beg += RARRAY(ary)->len;
       }
       return rb_ary_subseq(ary, beg, len);
   }
   if (argc != 1) {
       rb_scan_args(argc, argv, "11", 0, 0);
   }
   arg = argv[0];
   /* special case - speeding up */
   if (FIXNUM_P(arg)) {
       return rb_ary_entry(ary, FIX2LONG(arg));
   }
   if (SYMBOL_P(arg)) {
       rb_raise(rb_eTypeError, "Symbol as array index");
   }
   /* check if idx is Range */
   switch (rb_range_beg_len(arg, &beg, &len, RARRAY(ary)->len, 0)) {
     case Qfalse:
       break;
     case Qnil:
       return Qnil;
     default:
       return rb_ary_subseq(ary, beg, len);
   }
   return rb_ary_entry(ary, NUM2LONG(arg));
}
Comments

Have your say
Please use Textile formatting (click here for a cheat sheet). Use <code/> and <pre/> for code samples.
Click here to login with OpenID to to post comments.