1

次のコードについて助けてください。

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 行目 = Fiber.yield(square) || 仕事?ライン全体が何をしているのかではなく、コンポーネントの部分だけを理解していると思います。(これをよりよく理解するのに役立つ別の書き方はありますか?)。

(編集: このコードは、Peter Cooper による 295 ページの「Beginning Ruby, From Novice to Professional 2nd Ed」の例をわずかに変更したものです。)

4

1 に答える 1

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
于 2015-08-07T21:23:52.163 に答える