mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Make Enumerable#each_cons return object if over size
This behavior changed in dfb47bbd17
,
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.
This commit is contained in:
parent
d1cbec9b52
commit
a5cff7cc5d
Notes:
git
2021-11-17 12:31:54 +09:00
2 changed files with 7 additions and 5 deletions
10
enum.c
10
enum.c
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue