ステートレスイテレーター
ipairsのようなステートレスイテレーターを記述し、独自の派生形を実装します。
「ステートレスイテレーター」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。
状態を持たないイテレーターとは
状態を持たないイテレーターは、内部状態を保持しません。必要な情報はすべて、呼び出しごとに引数として渡します。不変のstateと現在のcontrol variableがこれに当たります。
ipairs:基本的な例
ipairsは状態を持ちません。テーブルをstateとして使い、現在のインデックスをcontrol variableとして使います。
local function myIpairs(t, i)
i = i + 1
local v = t[i]
if v ~= nil then return i, v end
end
-- Use: for i,v in myIpairs, t, 0 dosquaresイテレーター
連続する平方数を返す、状態を持たないイテレーターです。stateは上限を保持し、control variableは現在の数を表します。
local function squaresIter(max, n)
n = n + 1
if n <= max then return n, n*n end
end
for n, sq in squaresIter, 5, 0 do
print(n, sq)
endクロージャは不要
状態を持たないイテレーターでは、クロージャの生成を避けられます。すべてのstateが引数として渡されるため、反復ごとのヒープ割り当てはゼロです。
pairs形式のイテレーターの実装
nextをiterator functionとして使う、状態を持たないキーと値のイテレーターです。これはpairsの仕組みそのものです。
for k, v in next, {a=1, b=2} do
print(k, v)
endnext関数
next(t, k)は、キーkの後にある次のキーと値の組を返します。先頭から開始するにはnilを渡すか、省略します。
local t = {x=10, y=20}
local k, v = next(t, nil)
print(k, v)
k, v = next(t, k)
print(k, v)カスタム範囲イテレーター
stepを指定できる、状態を持たない範囲イテレーターです。stateは設定テーブルを保持し、controlは現在の値を表します。
local function rangeIter(state, n)
n = n + state.step
if n <= state.limit then return n end
end
for v in rangeIter, {limit=10, step=2}, 0 do
print(v)
endパフォーマンス上の利点
状態を持たないイテレーターは、タイトなループに最適です。呼び出しごとにクロージャが作成されないため、単純な走査では状態を持つクロージャイテレーターより高速です。
制限事項
反復に複雑な状態(複数のカウンター、キュー、動的なデータなど)が必要になると、状態を持たないイテレーターは扱いにくくなります。その場合は、状態を持つクロージャイテレーターまたはコルーチンを使ってください。
table.moveとの組み合わせ
状態を持たないスライスイテレーターは、テーブルの一部に含まれる要素を返します。不変のstateは配列と終端インデックスを保持し、controlは現在のインデックスを表します。
標準ライブラリの状態を持たないイテレーター
ipairs、pairs(next経由)、string.gmatchは、内部で状態を持たない、またはほぼ状態を持たない設計を使用しています。
状態を持たないイテレーターに関する質問
イテレーターが状態を持たないと言えるのはなぜですか?
まとめ:状態を持たないイテレーター
状態を持たないイテレーターは、すべてのコンテキストを引数として受け取り、クロージャの割り当てを必要とせず、高いパフォーマンスを発揮します。配列のインデックス処理のような、単純な順次走査に適しています。
よくある質問
「ステートレスイテレーター」レッスンは無料ですか?
はい。「ステートレスイテレーター」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。
「ステートレスイテレーター」で何を学びますか?
ipairsのようなステートレスイテレーターを記述し、独自の派生形を実装します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Lua Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「ステートレスイテレーター」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLua Academyレッスンでコードを書いて実行できますか?
はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。