0Pricing
Lua Academy · レッスン

ジェネリックforプロトコル

イテレーター関数、状態、制御変数からなる3値イテレータープロトコルを理解します。

「ジェネリックforプロトコル」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。

Generic forの仕組み

for文は、反復のたびにiterator functionを呼び出します。stateとcontrol variableを渡し、関数がnilを返すと停止します。

3つの値の返却

for var in iter, state, init do — Luaはこれを、iterator function iter、不変のstate state、初期control variable initとして展開します。

ipairsプロトコル

ipairs(t)は、状態を持たないiterator function、stateとしてのテーブル、初期control variableとしての0を返します。呼び出すたびに次のインデックスと値を返します。

for i, v in ipairs({10, 20, 30}) do
  print(i, v)
end

カスタムの3値イテレーター

3つの値をすべて明示的に指定すると、カスタムの状態を持たないイテレーターを実装できます。

local function iter(t, i)
  i = i + 1
  local v = t[i]
  if v then return i, v end
end
for i, v in iter, {"a","b","c"}, 0 do
  print(i, v)
end

クロージャによる簡略化

クロージャベースのイテレーターは、iterator functionだけを返せば済みます(stateとcontrol variableは不要です。これらはUpvalueに保持されます)。

local function values(t)
  local i = 0
  return function()
    i = i + 1
    return t[i]
  end
end
for v in values({1,2,3}) do print(v) end

nilでループを終了する

Generic forループは、iterator functionが最初の返り値としてnilを返すとすぐに終了します。これが終了条件の契約です。

複数の返り値

イテレーターは複数の値を返せます。各値はループ変数に対応します。例:for k, v in pairs(t)。

for k, v in pairs({x=1, y=2}) do
  print(k, v)
end

Stateパラメーターの使い方

stateパラメーターは、すべてのイテレーター呼び出しに変更されずに渡されます。状態を持たないイテレーターでは、必要なコンテキスト(例:テーブル自体)をすべて保持します。

イテレーターとしてのCoroutine.wrap

coroutine.wrap(fn)は、呼び出すたびにコルーチンを再開する関数を返します。yieldされた値が返り値になるため、Generic forのイテレーターとして最適です。

local function countdown(n)
  return coroutine.wrap(function()
    for i = n, 1, -1 do coroutine.yield(i) end
  end)
end
for v in countdown(5) do print(v) end

イテレーターの合成

イテレーターは合成できます。あるイテレーターを別のイテレーターでラップして、フィルタリングや変換を追加できます。

local function mapped(iter, fn)
  return function()
    local v = iter()
    if v ~= nil then return fn(v) end
  end
end

無限イテレーター

nilを返さないイテレーターは無限ループを作ります。必ず終了条件またはbreakを用意してください。

local function naturals()
  local n = 0
  return function() n = n+1; return n end
end
for v in naturals() do
  if v > 5 then break end
  print(v)
end

Generic forに関する質問

Generic forループはいつ停止しますか?

まとめ:Generic forプロトコル

Generic forは、不変のstateとcontrol variableを指定してiterator functionを呼び出します。nilが返ると停止します。クロージャを使うと、stateをUpvalueに保持して状態を持つイテレーターを簡単に実装できます。

よくある質問

「ジェネリックforプロトコル」レッスンは無料ですか?

はい。「ジェネリックforプロトコル」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。

「ジェネリックforプロトコル」で何を学びますか?

イテレーター関数、状態、制御変数からなる3値イテレータープロトコルを理解します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Lua Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「ジェネリックforプロトコル」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLua Academyレッスンでコードを書いて実行できますか?

はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

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

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