Fiber.yield使用||

时间:2015-08-07 21:05:00

标签: ruby concurrency fibers

我想在以下代码中提供一些帮助:

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)||工作工作?我想我理解组件部分并不是整个线路的作用。 (有没有另外一种写作方式可能更好地帮助我理解?)。

(编辑:这段代码是一个非常略微修改过的例子,从第295页开始,从初学者到初学者到专业第二版,由Peter Cooper撰写。)

1 个答案:

答案 0 :(得分:2)

根据yield

的文档
  

传递给下一个resume的任何参数都将是此Fiber.yield表达式求值的值。

该行

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