coroutine.yield() による中断
CoddyのLuaジャーニー「ロジックと制御フロー」セクションの一部 — レッスン 50/54。
コルーチンの真の力は
各
coroutine.yield() 関数からもたらされます。これにより、コルーチンは実行の途中で自身を一時停止(pauses)し、自身を再開(resume)したコードに制御を戻すことができます。コルーチンが coroutine.yield() を呼び出すと、その正確なポイントで直ちに実行を停止します。次にそのコルーチンに対して coroutine.resume() を呼び出すと、まるで何事もなかったかのように yield() 呼び出しの直後から再開します。簡単な例を以下に示します:function countToThree()
print("One")
coroutine.yield()
print("Two")
coroutine.yield()
print("Three")
end
local co = coroutine.create(countToThree)
coroutine.resume(co) -- "One" を出力し、その後一時停止
coroutine.resume(co) -- "Two" を出力し、その後一時停止
coroutine.resume(co) -- "Three" を出力し、その後終了resume()の呼び出しが、yield()に到達するまでコルーチンを実行することに注目してください。コルーチンは、すべてのローカル変数と実行状態を含め、中断した場所を正確に記憶しています。yield するときに値を送り返すこともできます。coroutine.yield() に渡した引数は、coroutine.resume() の返り値になります。coroutine.resume() は最初の値として常にブーリアン型の status(コルーチンがエラーなしで実行された場合は true、エラーが発生した場合は false)を返し、その後に yield() に渡された値が続くことに注意してください:function giveNumbers()
coroutine.yield(10)
coroutine.yield(20)
end
local co = coroutine.create(giveNumbers)
-- status は true、value は 10
local status, value = coroutine.resume(co)
print(value) -- 出力: 10
-- status は true、value は 20
status, value = coroutine.resume(co)
print(value) -- 出力: 20チャレンジ
簡単count を受け取り、複数回値を yield する coroutine からの出力を示す文字列を返す関数 createYieldingCoroutine を作成してください。
1 から count までの各ステップで、合計 count 回ステップ分だけ文字列 "Step X" を yield する coroutine を作成します。coroutine を count 回 resume して、yield されたすべての値を収集します。yield されたすべての値を改行で結合して返してください。
ロジック:
- ループを使用して
"Step 1"、"Step 2"などをcountまで yield する関数を作成します - すべての yield が終わったら、関数は完了します("Done" のための最後の yield はありません)
coroutine.create()を使用してこの関数を coroutine にラップします- coroutine を
count回 resume し、yield された各値を収集します - yield されたすべての値を改行文字で結合します
- 結合された文字列を返します
パラメータ:
count(number): yield するステップ数
戻り値: 改行で区切られた yield 値をすべて含む文字列 (string)。形式: Step 1\nStep 2\nStep 3
自分で試してみよう
function createYieldingCoroutine(count)
-- ここにコードを書いてください
end
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。