0Pricing
Lua Academy · レッスン

コルーチンベースのジェネレーター

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))   -- 15

coroutine.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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ジェネリックforプロトコル
  2. ステートレスイテレーター
  3. クロージャによるステートフルイテレーター
  4. コルーチンベースのジェネレーター
← Lua Academyに戻る