Menu
Coddy logo textTech

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
challenge icon

チャレンジ

簡単

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)  -- 出力: 20

coroutine.yield() に渡された引数は、coroutine.resume() の戻り値となります。コルーチンは、yield の間もすべてのローカル変数と実行状態を保持します。

自分で試してみよう

function createYieldingCoroutine(count)
    -- ここにコードを記述してください
end
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Logic & Flowのすべてのレッスン