mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Fix Enumerable#each_cons
and Enumerable#each_slice
to return a receiver
Co-authored-by: Takashi Kokubun <takashikkbn@gmail.com> Co-authored-by: Nobuyoshi Nakada <nobu@ruby-lang.org>
This commit is contained in:
parent
aa09c8dae0
commit
dfb47bbd17
Notes:
git
2021-10-25 12:14:06 +09:00
Merged: https://github.com/ruby/ruby/pull/1509 Merged-By: nobu <nobu@ruby-lang.org>
4 changed files with 14 additions and 10 deletions
12
enum.c
12
enum.c
|
@ -2961,11 +2961,11 @@ enum_each_slice_size(VALUE obj, VALUE args, VALUE eobj)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* call-seq:
|
* call-seq:
|
||||||
* each_slice(n) { ... } -> nil
|
* each_slice(n) { ... } -> self
|
||||||
* each_slice(n) -> enumerator
|
* each_slice(n) -> enumerator
|
||||||
*
|
*
|
||||||
* Calls the block with each successive disjoint +n+-tuple of elements;
|
* Calls the block with each successive disjoint +n+-tuple of elements;
|
||||||
* returns +nil+:
|
* returns +self+:
|
||||||
*
|
*
|
||||||
* a = []
|
* a = []
|
||||||
* (1..10).each_slice(3) {|tuple| a.push(tuple) } # => nil
|
* (1..10).each_slice(3) {|tuple| a.push(tuple) } # => nil
|
||||||
|
@ -2997,7 +2997,7 @@ enum_each_slice(VALUE obj, VALUE n)
|
||||||
ary = memo->v1;
|
ary = memo->v1;
|
||||||
if (RARRAY_LEN(ary) > 0) rb_yield(ary);
|
if (RARRAY_LEN(ary) > 0) rb_yield(ary);
|
||||||
|
|
||||||
return Qnil;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
|
@ -3040,11 +3040,11 @@ enum_each_cons_size(VALUE obj, VALUE args, VALUE eobj)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* call-seq:
|
* call-seq:
|
||||||
* each_cons(n) { ... } -> nil
|
* each_cons(n) { ... } -> self
|
||||||
* each_cons(n) -> enumerator
|
* each_cons(n) -> enumerator
|
||||||
*
|
*
|
||||||
* Calls the block with each successive overlapped +n+-tuple of elements;
|
* Calls the block with each successive overlapped +n+-tuple of elements;
|
||||||
* returns +nil+:
|
* returns +self+:
|
||||||
*
|
*
|
||||||
* a = []
|
* a = []
|
||||||
* (1..5).each_cons(3) {|element| a.push(element) } # => nil
|
* (1..5).each_cons(3) {|element| a.push(element) } # => nil
|
||||||
|
@ -3072,7 +3072,7 @@ enum_each_cons(VALUE obj, VALUE n)
|
||||||
memo = MEMO_NEW(rb_ary_new2(size), dont_recycle_block_arg(arity), size);
|
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);
|
rb_block_call(obj, id_each, 0, 0, each_cons_i, (VALUE)memo);
|
||||||
|
|
||||||
return Qnil;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
|
|
|
@ -10,7 +10,7 @@ describe "Enumerable#each_cons" do
|
||||||
|
|
||||||
it "passes element groups to the block" do
|
it "passes element groups to the block" do
|
||||||
acc = []
|
acc = []
|
||||||
@enum.each_cons(3){|g| acc << g}.should be_nil
|
@enum.each_cons(3){|g| acc << g}
|
||||||
acc.should == @in_threes
|
acc.should == @in_threes
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@ describe "Enumerable#each_cons" do
|
||||||
|
|
||||||
it "tries to convert n to an Integer using #to_int" do
|
it "tries to convert n to an Integer using #to_int" do
|
||||||
acc = []
|
acc = []
|
||||||
@enum.each_cons(3.3){|g| acc << g}.should == nil
|
@enum.each_cons(3.3){|g| acc << g}
|
||||||
acc.should == @in_threes
|
acc.should == @in_threes
|
||||||
|
|
||||||
obj = mock('to_int')
|
obj = mock('to_int')
|
||||||
|
|
|
@ -10,7 +10,7 @@ describe "Enumerable#each_slice" do
|
||||||
|
|
||||||
it "passes element groups to the block" do
|
it "passes element groups to the block" do
|
||||||
acc = []
|
acc = []
|
||||||
@enum.each_slice(3){|g| acc << g}.should be_nil
|
@enum.each_slice(3){|g| acc << g}
|
||||||
acc.should == @sliced
|
acc.should == @sliced
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@ describe "Enumerable#each_slice" do
|
||||||
|
|
||||||
it "tries to convert n to an Integer using #to_int" do
|
it "tries to convert n to an Integer using #to_int" do
|
||||||
acc = []
|
acc = []
|
||||||
@enum.each_slice(3.3){|g| acc << g}.should == nil
|
@enum.each_slice(3.3){|g| acc << g}
|
||||||
acc.should == @sliced
|
acc.should == @sliced
|
||||||
|
|
||||||
obj = mock('to_int')
|
obj = mock('to_int')
|
||||||
|
|
|
@ -731,6 +731,8 @@ class TestEnumerable < Test::Unit::TestCase
|
||||||
ary.clear
|
ary.clear
|
||||||
(1..10).each_slice(11) {|a| ary << a}
|
(1..10).each_slice(11) {|a| ary << a}
|
||||||
assert_equal([[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]], ary)
|
assert_equal([[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]], ary)
|
||||||
|
|
||||||
|
assert_equal(1..10, (1..10).each_slice(3) { })
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_each_cons
|
def test_each_cons
|
||||||
|
@ -750,6 +752,8 @@ class TestEnumerable < Test::Unit::TestCase
|
||||||
ary.clear
|
ary.clear
|
||||||
(1..5).each_cons(6) {|a| ary << a}
|
(1..5).each_cons(6) {|a| ary << a}
|
||||||
assert_empty(ary)
|
assert_empty(ary)
|
||||||
|
|
||||||
|
assert_equal(1..5, (1..5).each_cons(3) { })
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_zip
|
def test_zip
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue