Ruby on rails Enumerator.new如何处理通过的块?

Ruby on rails Enumerator.new如何处理通过的块?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我很难理解枚举器.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] fib=Enumerator.new do|y| a=b=1 环道 y[1,1,2,3,5,8,13,21,34,55]

我很难理解
枚举器.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]
fib=Enumerator.new do|y|
a=b=1
环道
y[1,1,2,3,5,8,13,21,34,55]

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

编辑我想我现在理解了你的问题,我仍将保留我的原始答案


y
枚举器
在内部使用。你的例子相当于:

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]

很酷,但是哪里有打破循环的语句呢<代码>@LeszekAndrukanis查看我的编辑。枚举数确实是无限的,枚举数中没有中断条件。由价值观的消费者决定他想要多少价值观@p11y我想OP想知道Ruby是如何在每次循环之后停止无限循环的iteration@LeszekAndrukanis好的,我想我现在明白你的问题了,再次编辑我的答案。
fib.next
#=> 1
fib.next
#=> 1
fib.next
#=> 2
fib.next
#=> 3
class Enumerator
  def my_take(n)
    result = []
    n.times do
      result << self.next
    end
    result
  rescue StopIteration
    # enumerator stopped early
    result
  end
end
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]