/* * call-seq: * enum.zip(arg, ...) => array * enum.zip(arg, ...) {|arr| block } => nil * * Converts any arguments to arrays, then merges elements of * <i>enum</i> with corresponding elements from each argument. This * generates a sequence of <code>enum#size</code> <em>n</em>-element * arrays, where <em>n</em> is one more that the count of arguments. If * the size of any argument is less than <code>enum#size</code>, * <code>nil</code> values are supplied. If a block given, it is * invoked for each output array, otherwise an array of arrays is * returned. * * a = [ 4, 5, 6 ] * b = [ 7, 8, 9 ] * * (1..3).zip(a, b) #=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]] * "cat\ndog".zip([1]) #=> [["cat\n", 1], ["dog", nil]] * (1..3).zip #=> [[1], [2], [3]] * */ static VALUE enum_zip(argc, argv, obj) int argc; VALUE *argv; VALUE obj; { int i; VALUE result; VALUE memo[3]; for (i=0; i<argc; i++) { argv[i] = rb_convert_type(argv[i], T_ARRAY, "Array", "to_a"); } result = rb_block_given_p() ? Qnil : rb_ary_new(); memo[0] = result; memo[1] = rb_ary_new4(argc, argv); memo[2] = 0; rb_iterate(rb_each, obj, zip_i, (VALUE)memo); return result; }