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 変数に格納されます。
チャレンジ
簡単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
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。