Fiber.yield 使用 ||

Fiber.yield using ||

我需要以下代码的帮助:

sg = Fiber.new do
    s = 0
    loop do
        square = s * s
        s += 1
        s = Fiber.yield(square) || s
    end
end

puts sg.resume
puts sg.resume
puts sg.resume
puts sg.resume 40
puts sg.resume
puts sg.resume 0
puts sg.resume
puts sg.resume

当运行时,输出:

0
1
4
1600
1681
0
1
4

第6行如何计算s = Fiber.yield(square) || s 工作?我想我只了解组成部分而不是整个生产线在做什么。 (有没有其他的写法可以更好地帮助我理解?)。

(编辑:此代码是 Peter Cooper 'Beginning Ruby, From Novice to Professional 2nd Ed' 第 295 页的示例,经过轻微修改。)

根据 yield

的文档

Any arguments passed to the next resume will be the value that this Fiber.yield expression evaluates to.

s = Fiber.yield(square) || s

将传递给 resume 的参数分配给 s。如果该值为 nil(或缺少参数),s 将重新分配给 s(即它不会更改)。

示例:

sg.resume       #=> s = nil || s
                #=> s = s

sg.resume 40    #=> s = 40  || s
                #=> s = 40

另一种写法是:

result = Fiber.yield(square)
s = result if result