ジェネリック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) endnilでループを終了する
Generic forループは、iterator functionが最初の返り値としてnilを返すとすぐに終了します。これが終了条件の契約です。
複数の返り値
イテレーターは複数の値を返せます。各値はループ変数に対応します。例:for k, v in pairs(t)。
for k, v in pairs({x=1, y=2}) do
print(k, v)
endStateパラメーターの使い方
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)
endGeneric 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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ジェネリックforプロトコル
- ステートレスイテレーター
- クロージャによるステートフルイテレーター
- コルーチンベースのジェネレーター