/* * call-seq: * array.first -> obj or nil * array.first(n) -> an_array * * Returns the first element, or the first +n+ elements, of the array. * If the array is empty, the first form returns <code>nil</code>, and the * second form returns an empty array. * * a = [ "q", "r", "s", "t" ] * a.first #=> "q" * a.first(1) #=> ["q"] * a.first(3) #=> ["q", "r", "s"] */ static VALUE rb_ary_first(argc, argv, ary) int argc; VALUE *argv; VALUE ary; { if (argc == 0) { if (RARRAY(ary)->len == 0) return Qnil; return RARRAY(ary)->ptr[0]; } else { VALUE nv, result; long n, i; rb_scan_args(argc, argv, "01", &nv); n = NUM2LONG(nv); if (n > RARRAY(ary)->len) n = RARRAY(ary)->len; result = rb_ary_new2(n); for (i=0; i<n; i++) { rb_ary_push(result, RARRAY(ary)->ptr[i]); } return result; } }