0Pricing
Lua Academy · レッスン

ステートレスイテレーター

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 do

squaresイテレーター

連続する平方数を返す、状態を持たないイテレーターです。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)
end

next関数

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

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

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