Implement Enumerator::Yielder#to_proc

A Yielder object can now be directly passed to another method as a
block argument.

```ruby
enum = Enumerator.new { |y|
  Dir.glob("*.rb") { |file|
    File.open(file) { |f| f.each_line(&y) }
  }
}
```

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67211 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
knu 2019-03-11 09:49:14 +00:00
parent 7d9664953b
commit c2d3b8dfb4
2 changed files with 40 additions and 2 deletions

View file

@ -493,6 +493,21 @@ class TestEnumerator < Test::Unit::TestCase
assert_equal([1, 2, 3], y.yield(2, 3))
assert_raise(LocalJumpError) { Enumerator::Yielder.new }
# to_proc (explicit)
a = []
y = Enumerator::Yielder.new {|x| a << x }
b = y.to_proc
assert_kind_of(Proc, b)
assert_equal([1], b.call(1))
assert_equal([1], a)
# to_proc (implicit)
e = Enumerator.new { |y|
assert_kind_of(Enumerator::Yielder, y)
[1, 2, 3].each(&y)
}
assert_equal([1, 2, 3], e.to_a)
end
def test_size