第1版はLua 5.0向けに書かれました。後のバージョンについては大枠では当てはまりますが、いくつかの相違点があります。
第4版はLua 5.3を対象に、Amazonや他の書店で入手できます。
書籍を購入することで、Luaプロジェクトを支援することにもなります。
![]() |
でプログラミングLua | ![]() |
第1部 言語編 第4章 ステートメント |
ジェネリックforループを使うと、イテレーター関数が返すすべての値を走査できます。ジェネリックforのサンプルはすでにいくつか見てきました。
-- print all values of array `a' for i,v in ipairs(a) do print(v) endコードの各ステップで、
i
にはインデックスが、v
にはそのインデックスに対応する値が代入されます。同様のサンプルで、テーブルのすべてのキーを走査する方法を示します。-- print all keys of table `t' for k in pairs(t) do print(k) endジェネリックforは一見単純なものの、強力なものです。適切なイテレーターを使うことで、ほとんどあらゆるものを走査し、読みやすい形で実行できます。標準ライブラリには複数のイテレーターが用意されており、ファイルの行(
io.lines
)、テーブルのペア(pairs
)、文字列の単語(第20章で見ていくstring.gfind
)などを反復処理できます。もちろん、イテレーターを自分で書くこともできます。ジェネリックforの使用は簡単ですが、イテレーター関数のライティングには巧妙さが要求されます。このトピックについては後ほど、第7章で取り上げます。ジェネリックループには、数値ループと2つの共通の特性があります。ループ変数はループ本体に対してローカルであり、ループ変数になんらかの値を代入してはならないということです。
ジェネリックforの利用について、さらに具体的なサンプルを見ていきましょう。曜日名が入ったテーブルがあるとします。
days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}この名前を週中の位置に変換してみたいと思います。その名前を探すためにテーブルを検索できます。しかし、頻繁には、Luaでより効率的なアプローチは、逆テーブル(
revDays
など)を構築することです。それには名前がインデックスになり、数字が値になります。テーブルはこのようになります。revDays = {["Sunday"] = 1, ["Monday"] = 2, ["Tuesday"] = 3, ["Wednesday"] = 4, ["Thursday"] = 5, ["Friday"] = 6, ["Saturday"] = 7}その場合、名前の順序を見つけるために必要なのは、この逆テーブルにインデックスを付けるだけです。
x = "Tuesday" print(revDays[x]) --> 3もちろん、逆テーブルを手動で宣言する必要はありません。オリジナルのテーブルから自動的に構築できます。
revDays = {} for i,v in ipairs(days) do revDays[v] = i endループは
days
の各要素に対して代入を行い、変数i
にインデックス(1、2、...)が入り、v
には値("Sunday"
、"Monday"
、...)が入ります。Copyright © 2003–2004 Roberto Ierusalimschy。無断転載を禁じます。 | ![]() |