coroutine.yield() による中断
CoddyのLuaジャーニー「Logic & Flow」セクションの一部 — レッスン 50/54。
コルーチンの真の力は、coroutine.yield() 関数から得られます。これにより、コルーチンは実行の途中で自身を一時停止し、それを再開したコードに制御を戻すことができます。
コルーチンが 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() に到達するまでコルーチンを実行する様子に注目してください。コルーチンは、すべてのローカル変数と実行状態を含め、停止した場所を正確に記憶しています。
イールド(中断)する際に値を返すこともできます。coroutine.yield() に渡した引数はすべて、coroutine.resume() の戻り値になります:
function giveNumbers()
coroutine.yield(10)
coroutine.yield(20)
end
local co = coroutine.create(giveNumbers)
local status, value = coroutine.resume(co)
print(value) -- 出力: 10
status, value = coroutine.resume(co)
print(value) -- 出力: 20チャレンジ
簡単count を受け取り、複数回値を yield するコルーチンからの出力を示す文字列を返す関数 createYieldingCoroutine を作成してください。
1 から count までの各ステップに対して文字列 "Step X" を yield し、終了時に "Done" を表示するコルーチンを作成します。コルーチンを count + 1 回再開して、すべての yield された値と最終的な完了を取得します。yield されたすべての値を改行で連結して返してください。
ロジック:
- ループを使用して
"Step 1"、"Step 2"などをcountまで yield する関数を作成します - すべての yield の後、関数は完了する必要があります("Done" のための最終的な yield は不要です)
coroutine.create()を使用して、この関数をコルーチンでラップします- コルーチンを
count回再開し、各 yield された値を収集します - すべての yield された値を改行文字で連結します
- 連結された文字列を返します
パラメータ:
count(数値): yield するステップ数
戻り値: yield されたすべての値を改行で区切った文字列 (string)。形式: Step 1\nStep 2\nStep 3
チートシート
coroutine.yield() 関数を使用すると、コルーチンの実行を一時停止し、呼び出し元に制御を戻すことができます。再度 coroutine.resume() が呼び出されると、コルーチンは yield() 呼び出しの直後から再開されます。
coroutine.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" を表示し、終了しますcoroutine.yield() で値を渡す:
function giveNumbers()
coroutine.yield(10)
coroutine.yield(20)
end
local co = coroutine.create(giveNumbers)
local status, value = coroutine.resume(co)
print(value) -- 出力: 10
status, value = coroutine.resume(co)
print(value) -- 出力: 20coroutine.yield() に渡された引数は、coroutine.resume() の戻り値となります。コルーチンは、yield の間もすべてのローカル変数と実行状態を保持します。
自分で試してみよう
function createYieldingCoroutine(count)
-- ここにコードを記述してください
end
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。