array.c:566
static VALUE
rb_ary_last(argc, argv, ary)
    int argc;
    VALUE *argv;
    VALUE ary;
{
    if (argc == 0) {
	if (RARRAY(ary)->len == 0) return Qnil;
	return RARRAY(ary)->ptr[RARRAY(ary)->len-1];
    }
    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=RARRAY(ary)->len-n; n--; i++) {
	    rb_ary_push(result, RARRAY(ary)->ptr[i]);
	}
	return result;
    }
}
