この第1版は Lua 5.0 向けに書かれました。後のバージョンでも大部分は関連していますが、いくつかの違いがあります。
第4版は Lua 5.3 を対象にしており、Amazon やその他の書店で入手できます。
この本を購入することで、Lua プロジェクトのサポートにも役立ちます。
![]() |
プログラミング inLua | ![]() |
第 III 部. 標準ライブラリ 第 19 章. テーブルライブラリ |
配列に関わるもう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
Copyright © 2003–2004 Roberto Ierusalimschy. All rights reserved. | ![]() |