Wat is in een for-lus het verschil tussen lussen met pairs() en ipairs()? Deze pagina gebruikt beide: Lua Docs
Met ipairs():
a = {"one", "two", "three"}
for i, v in ipairs(a) do
print(i, v)
end
Resultaat:
1 one
2 two
3 three
Met paren():
a = {"one", "two", "three"}
for i, v in pairs(a) do
print(i, v)
end
Resultaat:
1 one
2 two
3 three
Je kunt het hier testen: Lua Demo
Antwoord 1, autoriteit 100%
pairs()
en ipairs()
zijn iets anders.
pairs()
retourneert sleutel-waardeparen en wordt meestal gebruikt voor associatieve tabellen. sleutelvolgorde is niet gespecificeerd.ipairs()
retourneert indexwaardeparen en wordt meestal gebruikt voor numerieke tabellen. Niet-numerieke toetsen in een array worden genegeerd, terwijl de indexvolgorde deterministisch is (in numerieke volgorde).
Dit wordt geïllustreerd door het volgende codefragment.
> u={}
> u[1]="a"
> u[3]="b"
> u[2]="c"
> u[4]="d"
> u["hello"]="world"
> for key,value in ipairs(u) do print(key,value) end
1 a
2 c
3 b
4 d
> for key,value in pairs(u) do print(key,value) end
1 a
hello world
3 b
2 c
4 d
>
Wanneer u een tabel zonder sleutels maakt (zoals in uw vraag), gedraagt deze zich als een numerieke array en is het gedrag of paren en ipairs identiek.
a = {"one", "two", "three"}
is gelijk aan a[1]="one"
a[2]="two"
a[3]="three"
en pairs()
en ipairs()
zullen identiek zijn (behalve voor de volgorde die niet wordt gegarandeerd in pairs()
).
Antwoord 2, autoriteit 3%
Er is geen array
-type in Lua, alleen table
s die opeenvolgende elementen kunnen hebben vanaf index 1.
De generieke for-loop verwacht, in tegenstelling tot de numerieke for-loop, drie waarden:
- Een oproepbare
- Een contextwaarde die het doorgeeft
- Een initiële indexwaarde
Het roept de callable aan met context-value en index-value, waarbij alle geretourneerde waarden worden opgeslagen in de opgegeven nieuwe variabelen. De eerste wordt bovendien opgeslagen als de nieuwe indexwaarde.
Nu enkele representatieve voorbeelden van callables voor de lus:
-
ipairs(t)
retourneert een functie, de tabelt
en het startpunt0
.
De functie is het morele equivalent van:function ipairs_next(t, i) i = i + 1 var v = t[i] if v ~= nil then return i, v end end
Zo worden alle numerieke invoer vanaf 1 tot de eerste ontbrekende getoond.
-
pairs(t)
ofwel delegeert naar de metatabel vant
, specifiek naar__pairs(t)
, of geeft de functie terugnext
, de tabelt
, en het startpuntnil
.
next
accepteert een tabel en een index en retourneert de volgende index en de bijbehorende waarde, als deze bestaat.Aldus worden alle elementen in een willekeurige volgorde weergegeven.
-
Er zijn geen grenzen aan hoe creatief men met de functie kan zijn, en dat is wat Vanilla Lua verwacht.
Zie “bizzare” Probeer een tabelwaarde te bellen ” in Lua “voor een voorbeeld van een door de gebruiker geschreven callable en hoe sommige dialecten reageren als de eerste waarde niet echt een vulbaar is.