第1版はLua 5.0向けに書かれました。後のバージョンについては大枠では当てはまりますが、いくつかの相違点があります。
第4版はLua 5.3を対象に、Amazonや他の書店で入手できます。
書籍を購入することで、Luaプロジェクトを支援することにもなります。


4.3.5 – ジェネリックfor

ジェネリック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"、...)が入ります。