array.c:541
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;
    }
}
