1. ホーム
  2. lua

[解決済み] Luaでネストしたテーブルと数値キー

2022-02-19 20:44:29

質問

数値インデックスの関係で可能かどうかわかりませんが、どなたかご教示いただければ幸いです。

の表があるとする。

t = { 13, 200, 12, 15, 23 }

数字を使ったテーブルのネストはどうすればいいのですか?

t["200"] = {"stuff", "more stuff", "even more stuff"}

はうまくいかないようです。ポジション200が作成され、空のセルがnullで埋め尽くされてしまうからです。 サフィックスやプレフィックスとして文字を追加するのですが、問題は、テーブルを数値でソートしようとすることです。 これは可能なのでしょうか、それとも別の方法に行き詰まったのでしょうか? ありがとうございます。

気が付いたので少し編集。

t["200"] = {"stuff", "more stuff", "even more stuff"}

は、実際には "200" のキーを作成するのに対し。

t[200] = {"stuff", "more stuff", "even more stuff"}

はインデックス 200 を作成し、他のすべてを null にします。

解決方法は?

まず、DeadMGの言う通り、数値インデックスではなく文字列を使用しています。しかし、仮に数値のインデックスを使用したとしても、それは役に立ちません。

こうすれば

someTable = {"value1", "value2", {"value3a", "value3b"}};
someTable[50] = {"value50a", "value50b"};

テーブルの長さです。 #someTable になるのですが、それでも 3 . なぜか?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 はテーブルのエントリを含んでいます。 終了

または、次のようにすることもできます。 ipairs(nestedTable[#nestedTable]) . ここで使われている特定のキー(整数値)が 全く重要ではありません . そのキーは、文字列、浮動小数点数、別のテーブル、ユーザーデータなどであったかもしれません。それは重要ではありません。

また ipairs なぜなら、テーブルの配列のメンバーに対してのみ反復処理を行いたいからです。配列の長さは上で定義したとおりです。もしテーブルのすべてのメンバーに対してループ処理を行いたい場合は pairs の代わりに ipairs . もちろん pairs は順不同の検索を行うので、配列順であることが保証されているわけではありません。

ネストされたテーブルのすべての要素を再帰的に検索したい場合、このようにすることができます。

local function RecursiveSearch(aTable)
    for key, value in pairs(aTable) do --unordered search
        if(type(value) == "table") do
            RecursiveSearch(value)
        else
            --Do something with this.
        end
    end
end

テーブルが循環参照を持つことが可能なため、上記は無限ループになることに注意してください。

local tableA = {}
local tableB = {tableA}
local tableA[1] = tableB
RecursiveSearch(tableA) --Infinite loop.