この初版は Lua 5.0用に書かれました。後々のバージョンに適用することは概ね可能ですが、若干の相違点があります。
第4版は Lua 5.3を対象としており、Amazonや他の書店で入手できます。
書籍を購入することで、Lua プロジェクトを支援することにもなります。
![]() |
Lua でのプログラミングLua | ![]() |
第I部 言語 第 7 章 イテレータと汎用 for |
その名の通り、無状態のイテレータは、それ自体で状態を一切保持しないイテレータです。したがって、複数のループで同じ無状態のイテレータを使用でき、新しいクロージャーを作成するコストを回避できます。
for ループは、各イテレーションで、不変の状態と制御変数の 2 つの引数で、イテレータ関数を呼び出します。無状態のイテレータは、これら 2 つの引数のみを使用してイテレーションの次の要素を生成します。この種類のイテレータの代表的な例は ipairs
で、配列内のすべての要素を反復処理します。以下に示します。
a = {"one", "two", "three"} for i, v in ipairs(a) do print(i, v) endイテレーションの状態は、走査中のテーブル(ループ中に変化しない不変の状態)と現在のインデックス(制御変数)です。
ipairs
とそれが返すイテレータは非常に単純なので、次の Lua で記述できます。function iter (a, i) i = i + 1 local v = a[i] if v then return i, v end end function ipairs (a) return iter, a, 0 endLua が for ループで
ipairs(a)
を呼び出すと、3 つの値を取得します。iter
関数をイテレータとして、a
を不変の状態として、制御変数の初期値としてゼロを取得します。次に、Lua は iter(a, 0)
を呼び出します。これにより、1, a[1]
が返されます(ただし、a[1]
がすでに nil の場合は除きます)。2 番目のイテレーションでは iter(a, 1)
を呼び出し、2, a[2]
が返され、以降は最初の nil 要素まで続行されます。テーブル内のすべての要素を反復処理する pairs
関数は、Lua のプリミティブ関数であるイテレータ関数が next
関数であることを除けば、似ています。
function pairs (t) return next, t, nil end
k
がテーブル t
のキーである next(t, k)
の呼び出しは、テーブル内の次のキーを任意の順序で返します。(2 番目の戻り値として、そのキーに関連付けられた値も返します。)next(t, nil)
の呼び出しは最初のペアを返します。ペアがなくなった場合、next
は nil を返します。pairs
を呼び出さずに、next
を直接使用するほうが好ましい人もいます。
for k, v in next, t do ... endfor ループの式リストは 3 つの結果に調整されるため、Lua は
next
、t
、および nil を取得します。これは、pairs(t)
を呼び出したときに取得するものとまったく同じです。Copyright © 2003–2004 Roberto Ierusalimschy. All rights reserved. | ![]() |