mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* enumerator.c (lazy_zip): rescue StopIteration returned by
Enumerator#next. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35042 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
032861ade7
commit
d135138f9b
3 changed files with 25 additions and 1 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
Thu Mar 15 19:12:31 2012 Shugo Maeda <shugo@ruby-lang.org>
|
||||||
|
|
||||||
|
* enumerator.c (lazy_zip): rescue StopIteration returned by
|
||||||
|
Enumerator#next.
|
||||||
|
|
||||||
Thu Mar 15 18:19:53 2012 Shugo Maeda <shugo@ruby-lang.org>
|
Thu Mar 15 18:19:53 2012 Shugo Maeda <shugo@ruby-lang.org>
|
||||||
|
|
||||||
* enumerator.c (lazy_zip, lazy_cycle): Enumerator::Lazy#{zip,cycle}
|
* enumerator.c (lazy_zip, lazy_cycle): Enumerator::Lazy#{zip,cycle}
|
||||||
|
|
15
enumerator.c
15
enumerator.c
|
@ -1373,6 +1373,18 @@ lazy_grep(VALUE obj, VALUE pattern)
|
||||||
return rb_block_call(rb_cLazy, id_new, 1, &obj, lazy_grep_func, pattern);
|
return rb_block_call(rb_cLazy, id_new, 1, &obj, lazy_grep_func, pattern);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
call_next(VALUE obj)
|
||||||
|
{
|
||||||
|
return rb_funcall(obj, id_next, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
next_stopped(VALUE obj)
|
||||||
|
{
|
||||||
|
return Qnil;
|
||||||
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
lazy_zip_func(VALUE val, VALUE arg, int argc, VALUE *argv)
|
lazy_zip_func(VALUE val, VALUE arg, int argc, VALUE *argv)
|
||||||
{
|
{
|
||||||
|
@ -1383,7 +1395,8 @@ lazy_zip_func(VALUE val, VALUE arg, int argc, VALUE *argv)
|
||||||
ary = rb_ary_new2(RARRAY_LEN(arg) + 1);
|
ary = rb_ary_new2(RARRAY_LEN(arg) + 1);
|
||||||
rb_ary_push(ary, argv[1]);
|
rb_ary_push(ary, argv[1]);
|
||||||
for (i = 0; i < RARRAY_LEN(arg); i++) {
|
for (i = 0; i < RARRAY_LEN(arg); i++) {
|
||||||
v = rb_funcall(RARRAY_PTR(arg)[i], id_next, 0);
|
v = rb_rescue2(call_next, RARRAY_PTR(arg)[i], next_stopped, 0,
|
||||||
|
rb_eStopIteration, 0);
|
||||||
rb_ary_push(ary, v);
|
rb_ary_push(ary, v);
|
||||||
}
|
}
|
||||||
rb_funcall(yielder, id_yield, 1, ary);
|
rb_funcall(yielder, id_yield, 1, ary);
|
||||||
|
|
|
@ -130,6 +130,12 @@ class TestLazyEnumerator < Test::Unit::TestCase
|
||||||
assert_equal(1, a.current)
|
assert_equal(1, a.current)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_zip_short_arg
|
||||||
|
a = Step.new(1..5)
|
||||||
|
assert_equal([5, nil], a.zip("a".."c").last)
|
||||||
|
assert_equal([5, nil], a.lazy.zip("a".."c").force.last)
|
||||||
|
end
|
||||||
|
|
||||||
def test_zip_without_arg
|
def test_zip_without_arg
|
||||||
a = Step.new(1..3)
|
a = Step.new(1..3)
|
||||||
assert_equal([1], a.zip.first)
|
assert_equal([1], a.zip.first)
|
||||||
|
|
Loading…
Reference in a new issue