aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--enumerator.c11
-rw-r--r--test/ruby/test_enumerator.rb2
2 files changed, 10 insertions, 3 deletions
diff --git a/enumerator.c b/enumerator.c
index eb402804eb..f6b3aae1f7 100644
--- a/enumerator.c
+++ b/enumerator.c
@@ -3725,6 +3725,7 @@ enum_product_inspect(VALUE obj)
/*
* call-seq:
* Enumerator.product(*enums) -> enumerator
+ * Enumerator.product(*enums) { |elts| ... } -> enumerator
*
* Generates a new enumerator object that generates a Cartesian
* product of given enumerable objects. This is equivalent to
@@ -3733,6 +3734,9 @@ enum_product_inspect(VALUE obj)
* e = Enumerator.product(1..3, [4, 5])
* e.to_a #=> [[1, 4], [1, 5], [2, 4], [2, 5], [3, 4], [3, 5]]
* e.size #=> 6
+ *
+ * When a block is given, calls the block with each N-element array
+ * generated and returns +nil+.
*/
static VALUE
enumerator_s_product(int argc, VALUE *argv, VALUE klass)
@@ -3747,9 +3751,12 @@ enumerator_s_product(int argc, VALUE *argv, VALUE klass)
VALUE obj = enum_product_initialize(argc, argv, enum_product_allocate(rb_cEnumProduct));
- if (NIL_P(block)) return obj;
+ if (!NIL_P(block)) {
+ enum_product_run(obj, block);
+ return Qnil;
+ }
- return enum_product_run(obj, block);
+ return obj;
}
/*
diff --git a/test/ruby/test_enumerator.rb b/test/ruby/test_enumerator.rb
index c9ffd95977..010c1e4969 100644
--- a/test/ruby/test_enumerator.rb
+++ b/test/ruby/test_enumerator.rb
@@ -964,7 +964,7 @@ class TestEnumerator < Test::Unit::TestCase
# with a block
elts = []
ret = Enumerator.product(1..3) { |x| elts << x }
- assert_instance_of(Enumerator::Product, ret)
+ assert_equal(nil, ret)
assert_equal [[1], [2], [3]], elts
assert_equal elts, Enumerator.product(1..3).to_a