Menu
Coddy logo textTech

resume と yield

CoddyのLuaジャーニー「ロジックと制御フロー」セクションの一部 — レッスン 51/54。

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

コルーチンオブジェクトの後に追加の引数を指定して 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回目に再開(resume)されると、文字列 "Hello" が渡されて coroutine.yield() の戻り値となり、value 変数に格納されます。

challenge icon

チャレンジ

簡単

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

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

ロジック:

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

パラメータ:

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

戻り値: 改行で区切られた両方の yield 値を示す文字列 (string)。フォーマット: First: Hello\nSecond: Response

自分で試してみよう

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

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

ロジックと制御フローのすべてのレッスン