73

だから、私はこれらの行に沿ったテーブルを持っています:

arr =
{
  apples = { 'a', "red", 5 },
  oranges = { 'o', "orange", 12 },
  pears = { 'p', "green", 7 }
}

インデックスに基づいてそれらにアクセスすることはできないようで、値自体がテーブルであるため、ネストされたテーブルの最初の値をインデックスにしただけなので、次のようになります。

arr =
{
  apples = { 0, 'a', "red", 5 },
  oranges = { 1, 'o', "orange", 12 },
  pears = { 2, 'p', "green", 7 }
}

そのため、これらのテーブルのいずれかを使用するときはいつでも、インデックスが何であるかを知っていますが、それでもインデックスを使用してテーブルにアクセスできないため、それらすべてをループする関数を書き始め、インデックスをチェックするまでそれは正しいものを見つけます。それから私は気づきました...インデックスでそれらをまだ参照できない場合、どうすればそれらをループできますか? だから、今私は立ち往生しています。ほとんどの場合、 arr.apples と arr[1] を入力できるようにしたいのですが、もちろん、両方を実行する必要がある場合もあります。

4

5 に答える 5

121

テーブル内のすべてのキーと値のペアを反復するには、次を使用できますpairs

for k, v in pairs(arr) do
  print(k, v[1], v[2], v[3])
end

出力:

pears   2   p   green
apples  0   a   red
oranges 1   o   orange

編集:Luaは、テーブルの連想部分の反復順序を保証しないことに注意してください。特定の順序で項目にアクセスする場合は、からキーを取得してarr並べ替えます。次にarr、ソートされたキーを介してアクセスします。

local ordered_keys = {}

for k in pairs(arr) do
    table.insert(ordered_keys, k)
end

table.sort(ordered_keys)
for i = 1, #ordered_keys do
    local k, v = ordered_keys[i], arr[ ordered_keys[i] ]
    print(k, v[1], v[2], v[3])
end

出力:

  apples  a   red     5
  oranges o   orange  12
  pears   p   green   7
于 2013-07-02T22:49:35.603 に答える
9

複数のキーでネストされたテーブルを参照する場合は、それらを個別のキーに割り当てるだけです。テーブルは複製されず、同じ値を参照しています。

arr = {}
apples = {'a', "red", 5 }
arr.apples = apples
arr[1] = apples

このコード ブロックを使用すると、テーブル内のすべてのキーと値のペアを反復処理できます ( http://lua-users.org/wiki/TablesTutorial )。

for k,v in pairs(t) do
 print(k,v)
end
于 2013-07-02T22:48:06.350 に答える
5

なぜipairsが常にテーブルのすべての値を出力しないのか疑問に思っている人のために、ここにその理由を示します (これについてコメントしたいと思いますが、私は十分な良い少年ポイントを持っていません)。

関数ipairsは、キー 1 を持つ要素を持つテーブルでのみ機能します。キー 1 を持つ要素がある場合、ipairs は、1 -> 2 -> 3 -> の順序で、可能な限り移動しようとします。シーケンスの次のキーを持つ要素が見つからなくなるまで、4 など。要素の順序は重要ではありません。

これらの要件を満たさないテーブルはipairsでは機能せず、代わりにペアを使用してください。

例:

ipairsCompatable = {"AAA", "BBB", "CCC"}
ipairsCompatable2 = {[1] = "DDD", [2] = "EEE", [3] = "FFF"}
ipairsCompatable3 = {[3] = "work", [2] = "does", [1] = "this"}

notIpairsCompatable = {[2] = "this", [3] = "does", [4] = "not"}
notIpairsCompatable2 = {[2] = "this", [5] = "doesn't", [24] = "either"}

ipairsはその反復で可能な限り進みますが、テーブル内の他の要素を反復しません。

kindofIpairsCompatable = {[2] = 2, ["cool"] = "bro", [1] = 1, [3] = 3, [5] = 5 }

これらのテーブルを印刷すると、これらが出力になります。比較のためにペアの出力も含めました。

ipairs + ipairsCompatable
1       AAA
2       BBB
3       CCC

ipairs + ipairsCompatable2
1       DDD
2       EEE
3       FFF

ipairs + ipairsCompatable3
1       this
2       does
3       work

ipairs + notIpairsCompatable

pairs + notIpairsCompatable
2       this
3       does
4       not

ipairs + notIpairsCompatable2

pairs + notIpairsCompatable2
2       this
5       doesnt
24      either

ipairs + kindofIpairsCompatable
1       1
2       2
3       3

pairs + kindofIpairsCompatable
1       1
2       2
3       3
5       5
cool    bro
于 2020-02-06T05:49:47.080 に答える