Lua Academy · leksjon

Iterere over tabeller med pairs og ipairs

Gå trygt gjennom tabeller ved hjelp av pairs() og ipairs().

Leksjon 3 av 412 trinn

Iterere over tabeller med pairs og ipairs er en gratis leksjon i Lua Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Lua Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Lua Academy inneholder totalt 4 leksjoner.

ipairs: Iterasjon over arrayer i rekkefølge

ipairs(t) itererer over heltallssekvensen som starter ved indeks 1, og gir par av typen (index, value). Den stopper ved den første nil-verdien. Dette er det trygge og forutsigbare valget for array-lignende tabeller der rekkefølgen er viktig.

local fruits = {"apple","banana","cherry"}

for i, fruit in ipairs(fruits) do
  print(i, fruit)
end
-- 1  apple
-- 2  banana
-- 3  cherry

pairs: Alle nøkler

pairs(t) itererer over hvert ikke-nil nøkkel-verdi-par i tabellen, i en uspesifisert rekkefølge. Internt bruker den funksjonen next(). Bruk pairs for ordbøker, blandede tabeller eller når De må besøke alle nøkler uavhengig av type.

local info = {name="Lua", version=5.4, embedded=true}

for k, v in pairs(info) do
  print(k, v)
end
-- name  Lua
-- version  5.4
-- embedded  true  (order may vary)

Velge mellom pairs og ipairs

Bruk ipairs for sekvensielle arrayer (garantert rekkefølge, stopper ved nil). Bruk pairs for ordbøker, blandede tabeller eller når De trenger alle nøkler. Det fungerer å bruke pairs på en array, men rekkefølgen er ikke garantert. Hvis De bruker ipairs på en ordbok, blir ikke-heltallsnøkler utelatt.

local mixed = {10, 20, label="hello", 30}

-- ipairs: only sees 10, 20, 30 in order
for i, v in ipairs(mixed) do
  io.write(v .. " ")
end
print()  -- 10 20 30

-- pairs: sees everything
for k, v in pairs(mixed) do
  print(k, v)
end

Telle elementer

For sekvenser gir #t antallet elementer. For ordbøker er #t upålitelig – iterer med pairs og tell manuelt. Dette er et viktig skille som forebygger feil når De arbeider med blandede tabeller eller tabeller med strengnøkler.

local arr = {10, 20, 30}
print("#arr:", #arr)        -- 3 (reliable)

local dict = {a=1, b=2, c=3}
print("#dict:", #dict)      -- 0 (unreliable for dicts!)

local count = 0
for _ in pairs(dict) do count = count + 1 end
print("count:", count)       -- 3

Endre verdier under iterasjon

De kan trygt oppdatere verdien til en eksisterende nøkkel mens De itererer med pairs. Det å legge til eller fjerne nøkler under iterasjon har imidlertid udefinert oppførsel. Samle endringene og utfør dem etter løkken.

local prices = {apple=1.0, banana=0.5, cherry=2.0}

-- Safe: update existing values
for k, v in pairs(prices) do
  prices[k] = v * 1.1  -- 10% markup
end

for k, v in pairs(prices) do
  print(k, string.format("%.2f", v))
end

Samle nøkler

En vanlig operasjon er å samle alle nøkler i en sortert tabell for deterministisk utdata. Iterer med pairs for å samle nøklene, og bruk deretter table.sort til å sortere dem.

local config = {host="localhost", port=8080, debug=true}
local keys = {}

for k in pairs(config) do
  keys[#keys+1] = k
end
table.sort(keys)

for _, k in ipairs(keys) do
  print(k, "=", config[k])
end
-- debug = true
-- host = localhost
-- port = 8080

Iterasjon over nestede tabeller

For nestede tabeller (tabeller med tabeller) kombinerer De to løkker: Den ytre løkken itererer over det øverste nivået, og den indre løkken itererer over hver nestede tabell. Dette mønsteret håndterer alle dybder ved hjelp av rekursjon, også helt vilkårlig nesting.

local matrix = {
  {1,2,3},
  {4,5,6},
  {7,8,9},
}

for i, row in ipairs(matrix) do
  for j, val in ipairs(row) do
    io.write(string.format("%3d", val))
  end
  print()
end

Filtrering med ipairs

Bygg en filtrert liste ved å iterere med ipairs og legge til elementer som oppfyller et predikat. Resultatet er en ny array som bare inneholder de samsvarende elementene.

local function filter(t, pred)
  local result = {}
  for _, v in ipairs(t) do
    if pred(v) then result[#result+1] = v end
  end
  return result
end

local nums = {1,2,3,4,5,6,7,8,9,10}
local evens = filter(nums, function(n) return n % 2 == 0 end)
print(table.concat(evens, " "))  -- 2 4 6 8 10

Mapping med ipairs

Bruk en transformasjon på hvert element: Iterer og bygg en ny array med de transformerte verdiene. Dette tilsvarer map() i funksjonelle programmeringsspråk.

local function map(t, fn)
  local result = {}
  for i, v in ipairs(t) do
    result[i] = fn(v)
  end
  return result
end

local nums = {1, 2, 3, 4, 5}
local doubled = map(nums, function(n) return n * 2 end)
print(table.concat(doubled, " "))  -- 2 4 6 8 10

local words = {"hello","world"}
local upper = map(words, string.upper)
print(table.concat(upper, " "))    -- HELLO WORLD

pairs med egendefinerte iteratorer

De kan gjøre et egendefinert objekt itererbart ved å returnere en iterator og tilstand fra en funksjon. Mønsteret gjenspeiler hvordan pairs fungerer internt: Den returnerer next, t, nil. Iteratorfabrikken Deres returnerer på samme måte en funksjon samt en valgfri tilstand.

local function values(t)
  local i = 0
  return function()
    i = i + 1
    return t[i]
  end
end

for v in values({"x","y","z"}) do
  print(v)
end
-- x
-- y
-- z

Sjekk raskt

Hva er riktig om pairs() sammenlignet med ipairs()?

Oppsummering: pairs og ipairs

Oppsummering:

  • ipairs: sortert, heltallsnøkler fra og med 1, stopper ved nil
  • pairs: alle nøkler, vilkårlig rekkefølge, stopper aldri tidlig
  • Bruk pairs for ordbøker og ipairs for arrayer
  • Legg aldri til eller fjern nøkler midt i en pairs-iterasjon; det er trygt å oppdatere eksisterende verdier
  • Samle og sorter nøkler for deterministisk utdata
Gratis å komme i gang

Lær deg Lua med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
40
Leksjoner
159

Ofte stilte spørsmål

Er leksjonen «Iterere over tabeller med pairs og ipairs» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Lua Academy, inkludert «Iterere over tabeller med pairs og ipairs», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Lua Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Iterere over tabeller med pairs og ipairs»?

Gå trygt gjennom tabeller ved hjelp av pairs() og ipairs(). Du øver på Lua Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Lua Academy?

Ingen tidligere erfaring er nødvendig. Lua Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «Iterere over tabeller med pairs og ipairs»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Lua Academy-leksjonen?

Ja. Alle Lua Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Tabeller som arrayer
  2. Tabeller som ordbøker
  3. Iterere over tabeller med pairs og ipairs
  4. Nestede tabeller og strukturerte data
← Tilbake til Lua Academy