この第1版は Lua 5.0 向けに書かれました。後のバージョンでも大部分は関連していますが、いくつかの違いがあります。
第4版は Lua 5.3 を対象にしており、Amazon やその他の書店で入手できます。
この本を購入することで、Lua プロジェクトのサポートにも役立ちます。


19.3 – ソート

配列に関わるもう1つの便利な関数が `table.sort` で、これまでにも見てきました。ソートする配列と、オプションの順序関数を渡します。この順序関数は2つの引数を受け取り、最初の引数がソートされた配列で最初に来る場合に true を返します。この関数が指定されていない場合は、`sort` はデフォルトの less-than 演算(`<´ 演算子に対応)を使用します。

一般的な間違いは、テーブルのインデックス順序付けを試みることです。テーブルでは、インデックスはセットを形成し、どのような順序もありません。順序付けする場合は、配列にコピーしてから配列をソートする必要があります。例を見てみましょう。ソースファイルを読み取り、各関数名とその関数が定義されている行を示すテーブルを作成したとします。次のようなものです

    lines = {
      luaH_set = 10,
      luaH_get = 24,
      luaH_present = 48,
    }
ここで、これらの関数名をアルファベット順に印刷したいとします。このテーブルをペアで移動すると、名前は任意の順序で表示されます。ただし、これらの名前はテーブルのキーなので、直接並べ替えることはできません。ただし、これらの名前を配列に入れると、並べ替えられます。最初に、それらの名前を含む配列を作成してから、配列をソートし、最後に結果を出力します
    a = {}
    for n in pairs(lines) do table.insert(a, n) end
    table.sort(a)
    for i,n in ipairs(a) do print(n) end

Lua にとっては、配列にも順序がないことに注意してください。ただし、数値を数える方法はわかっているので、配列を順序付きのインデックスでアクセスする限り、順序付けされた値を取得できます。これが `pairs` ではなく `ipairs` で必ず配列をトラバースする必要がある理由です。最初の方法はキー順序 1、2、... を強制するのに対し、後者はテーブルの自然な任意の順序を使用します。

より高度な解決策として、キーの順序に従ってテーブルをトラバースするイテレータを作成できます。オプションパラメータ `f` を使用して、代替の順序を指定できます。最初にキーを配列にソートしてから、配列をイテレーションします。各ステップで、元のテーブルからキーと値を返します

    function pairsByKeys (t, f)
      local a = {}
      for n in pairs(t) do table.insert(a, n) end
      table.sort(a, f)
      local i = 0      -- iterator variable
      local iter = function ()   -- iterator function
        i = i + 1
        if a[i] == nil then return nil
        else return a[i], t[a[i]]
        end
      end
      return iter
    end
この関数を使用すると、関数名をアルファベット順に並べ替えて印刷するのは容易です。次のループでは、
    for name, line in pairsByKeys(lines) do
      print(name, line)
    end
次のように印刷されます。
    luaH_get        24
    luaH_present    48
    luaH_set        10