我正在查看Enumerator
类的文档,发现斐波纳契实现让我感到困惑。这是代码:
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]
这里发生了什么?循环块中的两行特别让我感到困惑。
链接:http://ruby-doc.org/core-2.1.5/Enumerator.html#method-c-new
答案 0 :(得分:2)
作为您提及的文档,<<
是yielder对象上yield
方法的别名,因此循环中的第一行等同于:
y.yield a
这是Enumerator
在调用next
方法时返回其下一个值的机制。
a, b = b, a + b
是并行分配,将新值分配给a
和b
,但其工作方式是计算右侧表达式的所有值首先,然后分配给左侧列出的变量,以便a
成为b
的上一个值,b
成为前一个a + b
的值1}},根据需要生成Fibonacci序列。
当Enumerator
被要求提供其下一个值时,会发生什么情况:块一直执行,直到它到达yield
,然后块的执行停止,并且该值作为下一个值返回。然后,当请求之后的下一个值时,块从它停止的位置继续(因此在此示例中,它将计算新的a
和b
)然后继续直到它到达{{ 1}}返回下一个值。