gpt4 book ai didi

ruby - 将 "yielder"对象传递给 Ruby 的枚举器

转载 作者:数据小太阳 更新时间:2023-10-29 09:03:30 29 4
gpt4 key购买 nike

我正在浏览 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是并行分配,将新值分配给 ab , 但其工作方式是首先计算右侧表达式的所有值,然后分配给左侧列出的变量,因此 a成为 b 的先前值和 b变成之前的值 a + b ,根据需要生成斐波那契数列。

Enumerator 时会发生什么被问及它的下一个值是该 block 执行直到它到达 yield然后 block 的执行停止,该值作为下一个值返回。然后当请求下一个值时, block 从它停止的地方继续(因此在这个例子中它将计算新的 ab )然后继续直到它到达 yield返回下一个值。

关于ruby - 将 "yielder"对象传递给 Ruby 的枚举器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29595379/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com