Wat is het verschil tussen paren() vs. ipairs() in Lua?

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 tables die opeenvolgende elementen kunnen hebben vanaf index 1.

De generieke for-loop verwacht, in tegenstelling tot de numerieke for-loop, drie waarden:

  1. Een oproepbare
  2. Een contextwaarde die het doorgeeft
  3. 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:

  1. ipairs(t)retourneert een functie, de tabel ten het startpunt 0.
    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.

  2. pairs(t)ofwel delegeert naar de metatabel van t, specifiek naar __pairs(t), of geeft de functie terug next, de tabel t, en het startpunt nil.
    nextaccepteert 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.

  3. 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.

Other episodes