作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在浏览 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]
这是怎么回事?循环 block 中的两行尤其让我感到困惑。
链接:http://ruby-doc.org/core-2.1.5/Enumerator.html#method-c-new
最佳答案
作为您链接到提到的文档,<<
是 yield
的别名yielder 对象上的方法,因此循环中的第一行相当于:
y.yield a
这是 Enumerator
的机制当 next
时返回它的下一个值方法被调用。
a, b = b, a + b
是并行分配,将新值分配给 a
和 b
, 但其工作方式是首先计算右侧表达式的所有值,然后分配给左侧列出的变量,因此 a
成为 b
的先前值和 b
变成之前的值 a + b
,根据需要生成斐波那契数列。
当 Enumerator
时会发生什么被问及它的下一个值是该 block 执行直到它到达 yield
然后 block 的执行停止,该值作为下一个值返回。然后当请求下一个值时, block 从它停止的地方继续(因此在这个例子中它将计算新的 a
和 b
)然后继续直到它到达 yield
返回下一个值。
关于ruby - 将 "yielder"对象传递给 Ruby 的枚举器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29595379/
我是一名优秀的程序员,十分优秀!