web-dev-qa-db-ja.com

Luaでテーブルを反復処理する方法は?

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

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 vs arr [1]を入力できるようにしたいのですが、もちろん両方を実行する必要があります。

46
Lemony Lime

テーブル内のすべてのキーと値のペアを反復処理するには、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
79
greatwolf

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

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
9
frr171