通过" yielder"对象是Ruby的枚举器

时间:2015-04-12 22:26:56

标签: ruby

我正在查看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

1 个答案:

答案 0 :(得分:2)

作为您提及的文档,<<是yielder对象上yield方法的别名,因此循环中的第一行等同于:

y.yield a

这是Enumerator在调用next方法时返回其下一个值的机制。

a, b = b, a + b是并行分配,将新值分配给ab,但其工作方式是计算右侧表达式的所有值首先,然后分配给左侧列出的变量,以便a成为b的上一个值,b成为前一个a + b的值1}},根据需要生成Fibonacci序列。

Enumerator被要求提供其下一个值时,会发生什么情况:块一直执行,直到它到达yield,然后块的执行停止,并且该值作为下一个值返回。然后,当请求之后的下一个值时,块从它停止的位置继续(因此在此示例中,它将计算新的ab)然后继续直到它到达{{ 1}}返回下一个值。