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