diff options
author | Jeremy Evans <code@jeremyevans.net> | 2021-11-16 13:43:00 -0800 |
---|---|---|
committer | Jeremy Evans <code@jeremyevans.net> | 2021-11-16 19:31:35 -0800 |
commit | a5cff7cc5de374be05db8e99c4ca975e60558a99 (patch) | |
tree | ca499a3ed49985bd85059fb28552396347e3809f | |
parent | d1cbec9b52dd3a2556aa8add4dbef4fd99f43945 (diff) |
Make Enumerable#each_cons return object if over size
This behavior changed in dfb47bbd17c3c2b8ce17dbafaf62df023b0224b2,
but only for normal exit, not for early exit. Fix it for early
exit as well.
While here, fix example code in documentation so that it doesn't
indicate that the method returns nil.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/5129
-rw-r--r-- | enum.c | 10 | ||||
-rw-r--r-- | test/ruby/test_enum.rb | 2 |
2 files changed, 7 insertions, 5 deletions
@@ -2968,12 +2968,12 @@ enum_each_slice_size(VALUE obj, VALUE args, VALUE eobj) * returns +self+: * * a = [] - * (1..10).each_slice(3) {|tuple| a.push(tuple) } # => nil + * (1..10).each_slice(3) {|tuple| a.push(tuple) } * a # => [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]] * * a = [] * h = {foo: 0, bar: 1, baz: 2, bat: 3, bam: 4} - * h.each_slice(2) {|tuple| a.push(tuple) } # => nil + * h.each_slice(2) {|tuple| a.push(tuple) } * a # => [[[:foo, 0], [:bar, 1]], [[:baz, 2], [:bat, 3]], [[:bam, 4]]] * * With no block given, returns an Enumerator. @@ -3047,12 +3047,12 @@ enum_each_cons_size(VALUE obj, VALUE args, VALUE eobj) * returns +self+: * * a = [] - * (1..5).each_cons(3) {|element| a.push(element) } # => nil + * (1..5).each_cons(3) {|element| a.push(element) } * a # => [[1, 2, 3], [2, 3, 4], [3, 4, 5]] * * a = [] * h = {foo: 0, bar: 1, baz: 2, bam: 3} - * h.each_cons(2) {|element| a.push(element) } # => nil + * h.each_cons(2) {|element| a.push(element) } * a # => [[[:foo, 0], [:bar, 1]], [[:bar, 1], [:baz, 2]], [[:baz, 2], [:bam, 3]]] * * With no block given, returns an Enumerator. @@ -3068,7 +3068,7 @@ enum_each_cons(VALUE obj, VALUE n) if (size <= 0) rb_raise(rb_eArgError, "invalid size"); RETURN_SIZED_ENUMERATOR(obj, 1, &n, enum_each_cons_size); arity = rb_block_arity(); - if (enum_size_over_p(obj, size)) return Qnil; + if (enum_size_over_p(obj, size)) return obj; memo = MEMO_NEW(rb_ary_new2(size), dont_recycle_block_arg(arity), size); rb_block_call(obj, id_each, 0, 0, each_cons_i, (VALUE)memo); diff --git a/test/ruby/test_enum.rb b/test/ruby/test_enum.rb index b71ed54653..f6375a4ffc 100644 --- a/test/ruby/test_enum.rb +++ b/test/ruby/test_enum.rb @@ -739,6 +739,7 @@ class TestEnumerable < Test::Unit::TestCase assert_equal([[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]], ary) assert_equal(1..10, (1..10).each_slice(3) { }) + assert_equal([], [].each_slice(3) { }) end def test_each_cons @@ -760,6 +761,7 @@ class TestEnumerable < Test::Unit::TestCase assert_empty(ary) assert_equal(1..5, (1..5).each_cons(3) { }) + assert_equal([], [].each_cons(3) { }) end def test_zip |