まず、DeadMG は正しいです。数値インデックスではなく文字列を使用しました。ただし、数値インデックスを使用したとしても、役に立ちません。
これを行う場合:
someTable = {"value1", "value2", {"value3a", "value3b"}};
someTable[50] = {"value50a", "value50b"};
テーブルの長さ は3#someTable
のままです。なんで?Lua は、連続する要素に基づいてテーブル内の配列を定義するためです。覚えておいてください: どのテーブルのどの要素にもアクセスできます。実際の値を指定するまで、それらはすべて概念的に満たされています。nil
Lua では、数値インデックス 1 から最初の値に到達するまでカウントを開始した場合、テーブルの長さをテーブル内の値の数として定義しnil
ます。someTable[4]
は nil なので、長さは 3 です。
配列テーブルの末尾に新しい要素を挿入する場合は、次のようにします。
someTable[#someTable + 1] = "newValue";
値自体をテーブルにすることができます。
someTable[#someTable + 1] = {"newValuea", "newValueb"};
入れ子になったテーブルにアクセスする方法を尋ねているだけなら、それは簡単で、使用するキーとは関係ありません。
ネストした表について特別なことは何もありません。テーブルは値であり、テーブル エントリは他のテーブルを含む任意の値にすることができます。
テーブルがあり、その中の配列エントリを調べたい場合は、これを使用します:
local aTable = {"first", "second", "third", ...}
for i, value in ipairs(aTable) do
--`value` contains the entries in the table.
end
ネストした表も例外ではありません。単にテーブルを取得するだけです。
local nestedTable = { "first", "second", "third", ...}
nestedTable[#nestedTable + 1] = {"newFirst", "newSecond", ...}
local aTable = nestedTable[#nestedTable];
for i, value in ipairs(aTable) do
--`value` contains the entries in the table.
end
または、単に行うこともできますipairs(nestedTable[#nestedTable])
。ここで使用される特定のキー (整数値) はまったく重要ではないことに注意してください。そのキーは、文字列、浮動小数点数、別のテーブル、ユーザーデータなどである可能性があります。それは問題ではありません。
ipairs
テーブルの配列メンバーのみを反復処理するために使用することにも注意してください。配列の長さは上で定義されています。テーブルのすべてのメンバーをループしたい場合は、pairs
代わりにを使用しipairs
ます。もちろん、pairs
順序付けされていない検索を行うため、配列順であるとは限りません。
ネストされたテーブル内のすべての要素を再帰的に検索する場合は、次のようにできます。
local function RecursiveSearch(aTable)
for key, value in pairs(aTable) do --unordered search
if(type(value) == "table") then
RecursiveSearch(value)
else
--Do something with this.
end
end
end
テーブルが循環参照を持つ可能性があるため、上記は無限ループを実行できることに注意してください。
local tableA = {}
local tableB = {tableA}
local tableA[1] = tableB
RecursiveSearch(tableA) --Infinite loop.