English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
テーブルはLuaのデータ構造の1つで、異なるデータ型(配列、辞書など)を作成するのを助けます。
Luaのテーブルは関連型配列を使用しており、任意のデータ型の値を使用して配列のインデックスとして使用できますが、この値はnilではありません。
Luaのテーブルは固定サイズではありません。必要に応じて自分で拡張できます。
Luaはまた、テーブルを使用してモジュール(module)、パッケージ(package)およびオブジェクト(Object)を解決します。 例えばstring.formatは"format"を使用してテーブルstringをインデックスするように表示されます。
コンストラクタはテーブルの作成と初期化を表す式です。テーブルはLua特有の強力な機能です。最もシンプルなコンストラクタは{}で、空のテーブルを作成するために使用されます。配列を直接初期化することができます:
-- テーブルの初期化 mytable = {} -- 指定値 mytable[1} -- 参照を削除 mytable = nil -- Luaのゴミ収集がメモリを解放します
table aに要素を設定し、aをbに割り当てると、aとbは同じメモリを指します。aがnilに設定された場合 、bもtableの要素にアクセスできます。aに指定された変数がない場合、Luaのゴミ収集メカニズムが対応するメモリをクリアします。
以下の例は、上記の説明を示しています:
-- シンプルなtable mytable = {} print("mytableの型は", type(mytable)) mytable[1} mytable["wow"] = "変更前" print("mytableのindexが 1 の要素は"", mytable[1]) print("mytableのindexがwowの要素は", mytable["wow"]) -- alternatetableとmytableは同じtableを指しています alternatetable = mytable print("alternatetableのindexが 1 の要素は"", alternatetable[1]) print("mytableのindexがwowの要素は", alternatetable["wow"]) alternatetable["wow"] = "変更後" print("mytableのindexがwowの要素は", mytable["wow"]) -- 変数の解放 alternatetable = nil print("alternatetableは", alternatetable) -- mytableはまだアクセスできます print("mytableのindexがwowの要素は", mytable["wow"]) mytable = nil print("mytableは", mytable)
以上のコードの実行結果は以下の通りです:
mytableの型はnilです。table mytableのindexが 1 の要素はnilです。Lua mytableのindexがwowの要素はnilです。変更前 alternatetableのindexが 1 の要素はnilです。Lua mytableのindexがwowの要素はnilです。変更前 mytableのindexがwowの要素はnilです。変更後 alternatetableはnilです mytableのindexがwowの要素はnilです。変更後 mytableはnilです
以下にTable操作でよく使われる方法を列挙しました:
序号 | 方法 & 用途 |
---|---|
1 | table.concat(table [, sep [, start [, end]]]): concatはconcatenate(連鎖、接続)の省略形です。table.concat()関数は、指定されたtableの配列部分をstart位置からend位置までのすべての要素をリストアップし、要素間を指定された区切り文字(sep)で区切ります。 |
2 | table.insert(table, [pos,] value): tableの配列部分の指定位置(pos)にvalue値の要素を挿入します。posパラメータはオプションです。デフォルトは配列部分の末尾です。 |
3 | table.maxn (table) table中のすべての正のkey値の最大のkey値を指定します。正のkey値を持つ要素が存在しない場合、0を返します。(Lua5.2その後、このメソッドは存在しなくなりました。本文ではカスタム関数を使用しています。) |
4 | table.remove (table [, pos]) tableの配列部分のpos位置にいる要素を返します。その後の要素は前に移動します。posパラメータはオプションです。デフォルトはtableの長さで、最後の要素から削除します。 |
5 | table.sort (table [, comp]) 指定されたtableを昇順に並び替えます。 |
次に、これらのメソッドの例を見てみましょう。
concat()を使用して、リストの要素を結合した文字列を出力できます:
fruits = {"banana","orange","apple"} -- 結合後のtable文字列を返します print("結合後の文字列 ",table.concat(fruits)) -- 指定結合文字 print("結合後の文字列 ",table.concat(fruits,", ")) -- 指定インデックスで結合 table print("結合後の文字列 ",table.concat(fruits,", ", 2,3))
以下のコードを実行すると、出力結果が:
結合後の文字列 bananaorangeapple 結合後の文字列 banana, orange, apple 結合後の文字列 orange, apple
以下の例では、tableの挿入および削除操作を示しています:
fruits = {"banana","orange","apple"} -- 末尾に挿入 table.insert(fruits,"mango") print("インデックスが 4 の要素为 ",fruits[4]) -- インデックスが 2 のキーに挿入 table.insert(fruits,2,"grapes") print("インデックスが 2 の要素为 ",fruits[2]) print("最後の要素为 ",fruits[5]) table.remove(fruits) print("削除後の最後の要素は ",fruits[5])
以下のコードを実行すると、出力結果が:
インデックスが 4 の要素は mango インデックスが 2 の要素は grapes 最後の要素は mango 削除後の最後の要素は nil
以下の例では、sort()メソッドの使用を示しています。これはTableをソートするために使用されます:
fruits = {"banana", "orange", "apple", "grapes"} print("ソート前") for k, v in ipairs(fruits) do print(k, v) end table.sort(fruits) print("ソート後") for k, v in ipairs(fruits) do print(k, v) end
以下のコードを実行すると、出力結果が:
ソート前 1 banana 2 orange 3 apple 4 grapes ソート後 1 apple 2 banana 3 grapes 4 orange
Luaでのtable.maxn5.2 その後、该方法は存在しなくなり、table_maxnメソッドを定義して実現しました。
以下の例では、table内の最大値を取得する方法を示しています:
function table_maxn(t) local mn = nil; for k, v in pairs(t) do if(mn == nil) then mn = v end if mn < v then mn = v end end return mn end tbl = {[1] = 2, [2] = 6, [3] = 34, [26] =5} print("tbl 最大値:", table_maxn(tbl)) print("tbl 長さ", #tbl)
以下のコードを実行すると、出力結果が:
tbl 最大値: 34 tbl 長さ 3
注意:
tableの長さを取得する際に、#またはtable.getnを使用しても、インデックスの中断地点でカウントが停止し、正確なtableの長さを取得できません。
以下の方法で代用できます:
function table_leng(t) local leng = 0 for k, v in pairs(t) do leng = leng+1 end return leng; end