array.c:1418
static VALUE
rb_ary_zip(argc, argv, ary)
    int argc;
    VALUE *argv;
    VALUE ary;
{
    int i, j;
    long len;
    VALUE result;

    for (i=0; i<argc; i++) {
	argv[i] = to_ary(argv[i]);
    }
    if (rb_block_given_p()) {
	for (i=0; i<RARRAY(ary)->len; i++) {
	    VALUE tmp = rb_ary_new2(argc+1);

	    rb_ary_push(tmp, rb_ary_entry(ary, i));
	    for (j=0; j<argc; j++) {
		rb_ary_push(tmp, rb_ary_entry(argv[j], i));
	    }
	    rb_yield(tmp);
	}
	return Qnil;
    }
    len = RARRAY(ary)->len;
    result = rb_ary_new2(len);
    for (i=0; i<len; i++) {
	VALUE tmp = rb_ary_new2(argc+1);

	rb_ary_push(tmp, rb_ary_entry(ary, i));
	for (j=0; j<argc; j++) {
	    rb_ary_push(tmp, rb_ary_entry(argv[j], i));
	}
	rb_ary_push(result, tmp);
    }
    return result;
}
