コルーチンベースのジェネレーター
coroutine.wrapで遅延評価されるジェネレーター列を作成します。
「コルーチンベースのジェネレーター」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。
コルーチンジェネレーターを使う理由
クロージャーは単純なジェネレーターには適しています。しかし、生成ロジックにネストしたループや複雑な制御フローが必要な場合は、コルーチンジェネレーターのほうがはるかにすっきり記述できます。
coroutine.wrap の基本
coroutine.wrap(fn) は関数を返します。呼び出すたびにコルーチンが再開され、coroutine.yield で yield された値が戻り値になります。
local gen = coroutine.wrap(function()
coroutine.yield(1)
coroutine.yield(2)
coroutine.yield(3)
end)
for v in gen do print(v) end無限シーケンスジェネレーター
コルーチンは無期限に値を yield できるため、呼び出し側が break で終了させる無限シーケンスに最適です。
local function naturals()
return coroutine.wrap(function()
local n = 0
while true do
n = n + 1
coroutine.yield(n)
end
end)
end
for v in naturals() do
if v > 5 then break end
print(v)
endツリー走査ジェネレーター
コルーチンを使えば、再帰的な深さ優先走査を簡単に記述できます。明示的なスタックを管理せず、再帰呼び出しから値を yield するだけです。
local function walkTree(node)
return coroutine.wrap(function()
local function recurse(n)
coroutine.yield(n.value)
for _, child in ipairs(n.children or {}) do
recurse(child)
end
end
recurse(node)
end)
endフィボナッチジェネレーター
フィボナッチ数列はコルーチンで自然に表現できます。2つの状態変数を保持し、各項を yield します。
local function fibs()
return coroutine.wrap(function()
local a, b = 0, 1
while true do
coroutine.yield(a)
a, b = b, a + b
end
end)
end
local fib = fibs()
for i = 1, 8 do print(fib()) endジェネレーターへの値の受け渡し
再開された関数に渡した引数は yield の戻り値になります。これにより双方向の通信が可能です。
local acc = coroutine.wrap(function()
local total = 0
while true do
local n = coroutine.yield(total)
total = total + (n or 0)
end
end)
acc() -- start
print(acc(10)) -- 10
print(acc(5)) -- 15coroutine.wrap と coroutine.create の比較
wrap はより単純で、エラーが発生すると例外をスローします。create はスレッドオブジェクトを返し、resume の戻り値からエラーを処理できます。
ジェネレーターパイプライン
コルーチンベースのジェネレーターを連結して遅延パイプラインを構築できます。producer が生データを yield し、filter が一致する項目を yield し、map が変換後の項目を yield します。
エラーの伝播
ラップされたコルーチンでエラーが発生すると、wrap 関数もエラーをスローします。安全に利用するには、ジェネレーターの呼び出しを pcall でラップしてください。
メモリ効率
コルーチンジェネレーターは遅延評価され、必要になった時点で値を計算します。これにより大きな中間テーブルの作成を避けられるため、大規模なデータセットで大きな利点があります。
使い果たした場合の処理
コルーチン関数が yield ではなく return すると、ラップされた関数を次に呼び出したときに nil が返され、generic for ループが自然に終了します。
コルーチンジェネレーターに関する質問
coroutine.wrap ベースのジェネレーターで、コルーチン関数が yield ではなく return すると何が起こりますか?
復習:コルーチンジェネレーター
coroutine.wrap は、任意のコルーチンを再利用可能なジェネレーター関数に変換します。これにより、遅延評価される無限シーケンス、再帰的な走査、パイプラインの各段階を、すっきりした制御フローで実現できます。
よくある質問
「コルーチンベースのジェネレーター」レッスンは無料ですか?
はい。「コルーチンベースのジェネレーター」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。
「コルーチンベースのジェネレーター」で何を学びますか?
coroutine.wrapで遅延評価されるジェネレーター列を作成します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Lua Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「コルーチンベースのジェネレーター」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLua Academyレッスンでコードを書いて実行できますか?
はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ジェネリックforプロトコル
- ステートレスイテレーター
- クロージャによるステートフルイテレーター
- コルーチンベースのジェネレーター