summaryrefslogtreecommitdiff
path: root/array.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-05-13 17:15:25 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-05-13 17:15:25 +0000
commit46590a41321abd10239f069907bed04221e5d870 (patch)
tree0864eb27fe0dc5d2227924536220537393e959e1 /array.c
parentaa77090aefa957855e69f83bbae43cea63101460 (diff)
* array.c (rb_ary_zip): a.zip(b,c) should return an array, not
enumerator. * array.c (rb_ary_zip): a.zip(b,c) should return array with size truncated to the size of its shortest argument array. [incompatible] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12277 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'array.c')
-rw-r--r--array.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/array.c b/array.c
index 42bda2f444..dc52e8f84c 100644
--- a/array.c
+++ b/array.c
@@ -1974,18 +1974,17 @@ rb_ary_delete_if(VALUE ary)
* Converts any arguments to arrays, then merges elements of
* <i>self</i> with corresponding elements from each argument. This
* generates a sequence of <code>self.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>enumObj.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.
+ * arrays, where <em>n</em> is one more that the count of arguments.
+ * The size of returned array is truncated to the size of the
+ * shortest argument enumerable. 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,2,3].zip(a, b) #=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
* [1,2].zip(a,b) #=> [[1, 4, 7], [2, 5, 8]]
- * a.zip([1,2],[8]) #=> [[4,1,8], [5,2,nil], [6,nil,nil]]
+ * a.zip([1,2],[8]) #=> [[4,1,8]]
*/
static VALUE
@@ -1995,12 +1994,14 @@ rb_ary_zip(int argc, VALUE *argv, VALUE ary)
long len;
VALUE result;
- RETURN_ENUMERATOR(ary, argc, argv);
+ len = RARRAY_LEN(ary);
for (i=0; i<argc; i++) {
argv[i] = to_a(argv[i]);
+ if (len > RARRAY_LEN(argv[i]))
+ len = RARRAY_LEN(argv[i]);
}
if (rb_block_given_p()) {
- for (i=0; i<RARRAY_LEN(ary); i++) {
+ for (i=0; i<len; i++) {
VALUE tmp = rb_ary_new2(argc+1);
rb_ary_push(tmp, rb_ary_elt(ary, i));
@@ -2011,7 +2012,6 @@ rb_ary_zip(int argc, VALUE *argv, VALUE ary)
}
return Qnil;
}
- len = RARRAY_LEN(ary);
result = rb_ary_new2(len);
for (i=0; i<len; i++) {
VALUE tmp = rb_ary_new2(argc+1);