Hoe de tabel in Lua doorlopen?

Dus ik heb een tabel in de trant van:

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

Het lijkt erop dat het niet mogelijk is om ze te openen op basis van hun index, en de waarden zelf zijn tabellen, dus ik heb zojuist de eerste waarde van de geneste tabel de index ervan gemaakt, dus het ziet er nu als volgt uit:

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

Dus als ik nu een van deze tabellen gebruik, weet ik wat de index is, maar ik kan nog steeds niet bij de tabel komen met de index, dus begon ik een functie te schrijven die ze allemaal doorloopt, en controleer de indexen totdat het de juiste vindt. Toen realiseerde ik me… hoe kan ik er doorheen bladeren als ik er niet al naar kan verwijzen met hun index? Dus nu zit ik vast. Ik wil de meeste tijd echt arr.apples vs arr[1] kunnen typen, maar natuurlijk is het soms nodig om beide te doen.


Antwoord 1, autoriteit 100%

Om alle sleutel-waardeparen in een tabel te herhalen, kunt u pairsgebruiken:

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

uitgangen:

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

Bewerken: Merk op dat Lua geen iteratievolgorde garandeert voor het associatieve deel van de tabel. Als u de items in een specifieke volgorde wilt openen, haalt u de sleutels op uit arren sorteert u deze. Ga vervolgens naar arrvia de gesorteerde sleutels:

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

uitgangen:

 apples  a   red     5
  oranges o   orange  12
  pears   p   green   7

Antwoord 2, autoriteit 8%

Als u met meerdere toetsen naar een geneste tabel wilt verwijzen, kunt u ze gewoon aan afzonderlijke toetsen toewijzen. De tabellen zijn niet gedupliceerd en verwijzen nog steeds naar dezelfde waarden.

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

Met dit codeblok kunt u alle sleutel-waardeparen in een tabel doorlopen (http://lua -users.org/wiki/TablesTutorial):

for k,v in pairs(t) do
 print(k,v)
end

Antwoord 3, autoriteit 4%

Voor degenen die zich afvragen waarom ipairsniet alle waarden van de tabel de hele tijd afdrukt, hier is waarom (ik zou hier commentaar op willen geven, maar ik heb niet genoeg goede jongenspunten).

De functie ipairswerkt alleen op tabellen die een element met de sleutel 1 hebben. Als er een element is met de sleutel 1, zal ipairs proberen zo ver mogelijk te gaan in een sequentiële volgorde , 1 -> 2 -> 3 -> 4 enz. totdat het geen element kan vinden met een sleutel die de volgende in de reeks is. De volgorde van de elementen maakt niet uit.

Tabellen die niet aan deze vereisten voldoen, werken niet met ipairs, gebruik in plaats daarvan pairs.

Voorbeelden:

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"}

ipairsgaat zo ver als het kan met zijn iteraties, maar itereert niet over enig ander element in de tabel.

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

Bij het afdrukken van deze tabellen zijn dit de outputs. Ik heb ook paren-uitgangen toegevoegd ter vergelijking.

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

Antwoord 4

Alle antwoorden hier suggereren om ipairs te gebruiken, maar pas op, het werkt niet altijd.

t = {[2] = 44, [4]=77, [6]=88}
--This for loop prints the table
for key,value in next,t,nil do 
  print(key,value) 
end
--This one does not print the table
for key,value in ipairs(t) do 
  print(key,value) 
end

Other episodes