Enumerator.new如何使用块传递?

Les*_*nis 5 ruby ruby-on-rails

我对理解该Enumerator.new方法的工作方式有点挣扎.假设文档中的示例:

fib = Enumerator.new do |y|
  a = b = 1
  loop do
    y << a
    a, b = b, a + b
  end
end

p fib.take(10) # => [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
Run Code Online (Sandbox Code Playgroud)

循环中断条件在哪里,它如何知道循环应迭代多少次(因为它没有任何明确的中断条件并且看起来像无限循环)?

Ste*_*fan 4

Enumerator内部使用纤维。你的例子相当于:

require 'fiber'

fiber = Fiber.new do
  a = b = 1
  loop do
    Fiber.yield a
    a, b = b, a + b
  end
end

10.times.map { fiber.resume }
#=> [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
Run Code Online (Sandbox Code Playgroud)