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]