Menu
Coddy logo textTech

resume と yield

CoddyのLuaジャーニー「Logic & Flow」セクションの一部 — レッスン 51/54。

前のレッスンでは、coroutine.yield() を使用してコルーチンがメインコードに値を返す方法を学びました。しかし、通信は双方向に行うことができます。コルーチンを再開するときに、値をコルーチンの中へ送ることもできます。

コルーチンオブジェクトの後に引数を追加して coroutine.resume() を呼び出すと、それらの引数はコルーチンに渡されます。コルーチン内では、これらの値は、そのコルーチンを一時停止させた coroutine.yield() 呼び出しの戻り値となります。

動作の仕組みは次のとおりです:

function receiver()
    print("Coroutine started")
    local value = coroutine.yield()
    print("Received: " .. value)
end

local co = coroutine.create(receiver)
coroutine.resume(co)           -- yieldで開始し、一時停止します
coroutine.resume(co, "Hello")  -- コルーチンに "Hello" を渡します

コルーチンが2回目に再開されるとき、文字列 "Hello" が渡され、coroutine.yield() の戻り値となり、それが value 変数に格納されます。

challenge icon

チャレンジ

簡単

initialMessage を受け取り、メインコードとコルーチン間の双方向通信を示す文字列を返す関数 createEchoCoroutine を作成してください。

まず initialMessage を yield し、次に再開(resume)されたときにレスポンスを受け取り、最後にそのレスポンスを再び yield するコルーチンを作成します。この関数は、コルーチンの外部への値の受け渡しと、内部への値の受け渡しの両方を実証する必要があります。

ロジック:

  • initialMessage を yield し、その yield からの戻り値を保存する関数を作成します
  • 値を受け取った後、それを再び yield します
  • coroutine.create() を使用して、この関数をコルーチンにラップします
  • コルーチンを最初に再開して、初期メッセージを取得します
  • "Response" を渡して、コルーチンを2回目に再開します
  • 2回目の再開から yield された値をキャプチャします
  • 次の形式の文字列を返します: First: [first_yield]\nSecond: [second_yield]

パラメータ:

  • initialMessage (string): コルーチンが最初に yield するメッセージ

戻り値: 改行で区切られた両方の yield 値を示す文字列 (string)。形式: First: Hello\nSecond: Response

チートシート

coroutine.resume() に追加の引数を渡すことで、コルーチンを再開する際に値を送ることができます。これらの引数は、コルーチンを一時停止させた coroutine.yield() 呼び出しの戻り値となります。

function receiver()
    local value = coroutine.yield()  -- 一時停止して入力を待機
    print("Received: " .. value)
end

local co = coroutine.create(receiver)
coroutine.resume(co)           -- コルーチンを開始し、yieldで一時停止
coroutine.resume(co, "Hello")  -- "Hello" をコルーチンに渡す

コルーチンが2回目に再開されるとき、"Hello" が渡され、coroutine.yield() の戻り値となり、value 変数に格納されます。

自分で試してみよう

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

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

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