Lua Academy · Lektion

Tabeller som ordbøger

Brug strengnøgler og blandede nøgler til at gemme nøgleværdi-par.

Lektion 2 af 412 trin

Tabeller som ordbøger er en gratis Lua Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Lua Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Lua Academy-kurset indeholder 4 lektioner i alt.

Strengnøgler

Tabeller med strengnøgler fungerer som ordbøger (hash-tabeller). Du tilgår felter med punktnotationen t.key (for gyldige identifikatorer) eller kantet parentes-notationen t["key"] (for enhver streng). De to former er ækvivalente; kantet parentes-notation understøtter dynamiske nøgler.

local user = {}
user.name = "Alice"
user["age"] = 30
user.role = "admin"

print(user.name)        -- Alice
print(user["age"])      -- 30

local field = "role"
print(user[field])      -- admin (dynamic key)

Tabel-litteraler

Ordbøger kan initialiseres med en tabel-literal ved hjælp af syntaksen key = value. Dette er den mest almindelige måde at oprette poster på i Lua. Du kan blande array-lignende og ordbogs-lignende elementer i den samme literal.

local config = {
  host = "localhost",
  port = 3306,
  database = "myapp",
  debug = false,
  tags = {"web", "api"},  -- nested array
}

print(config.host)        -- localhost
print(config.port)        -- 3306
print(config.tags[1])     -- web

Tælling med ordbøger

En klassisk anvendelse af ordbøger er frekvenstælling. Gennemløb en liste, brug hvert element som en nøgle, og forøg tælleren. Kontrollér, om værdien er nil, før du forøger den — brug count[word] or 0 som startværdi.

local words = {"lua","is","fast","lua","is","lua"}
local freq = {}

for _, w in ipairs(words) do
  freq[w] = (freq[w] or 0) + 1
end

for word, count in pairs(freq) do
  print(word, count)
end
-- lua 3, is 2, fast 1

Gruppering med ordbøger

Gruppér data efter en egenskab: Gennemløb listen, og brug grupperingsnøglen til at føje elementer til en liste i en ordbog. Dette svarer i Lua til SQL's GROUP BY eller Pythons defaultdict-mønster.

local people = {
  {name="Alice", dept="eng"},
  {name="Bob",   dept="hr"},
  {name="Carol", dept="eng"},
  {name="Dave",  dept="hr"},
}
local groups = {}

for _, p in ipairs(people) do
  local d = p.dept
  groups[d] = groups[d] or {}
  groups[d][#groups[d]+1] = p.name
end

print(table.concat(groups.eng, ", "))  -- Alice, Carol

Kontrol af, om en nøgle findes

Test, om en nøgle findes, ved at sammenligne dens værdi med nil. Vær opmærksom på, at hvis værdien, der er gemt under en nøgle, er nil, betragtes nøglen som fraværende. Til tilstedeværelsesflag skal du gemme true som værdien i stedet for nil.

local cache = {result=42, mode="fast"}

if cache.result ~= nil then
  print("cached:", cache.result)  -- 42
end

-- Key not present:
if cache.timeout == nil then
  print("no timeout set")
end

-- Membership set pattern
local allowed = {admin=true, editor=true}
if allowed["admin"] then
  print("access granted")
end

Sletning af nøgler

Sæt en tabelnøgle til nil for at fjerne den. Nøgle-værdi-parret forsvinder, og garbage collectoren kan frigive værdien fra hukommelsen. Du kan ikke slette en lokal variabel på denne måde — kun tabelposter.

local session = {token="abc123", user="Alice", expires=3600}
print(session.token)   -- abc123

session.token = nil
print(session.token)   -- nil (removed)

-- Count remaining keys
local count = 0
for _ in pairs(session) do count = count + 1 end
print(count)   -- 2

Sammenfletning af ordbøger

Sammenflet to tabeller ved at gennemløbe den ene og kopiere dens poster til den anden. Hvis begge har den samme nøgle, vinder værdien fra den anden tabel. Dette svarer i Lua til JavaScripts Object.assign.

local defaults = {color="blue", size=12, bold=false}
local overrides = {color="red", italic=true}

local function merge(base, over)
  local result = {}
  for k, v in pairs(base) do result[k] = v end
  for k, v in pairs(over) do result[k] = v end
  return result
end

local opts = merge(defaults, overrides)
print(opts.color, opts.size, opts.italic)  -- red 12 true

Enhver nøgletype

Tabelnøgler kan være enhver værdi, der hverken er nil eller NaN: strenge, tal, boolske værdier, funktioner og endda andre tabeller. Heltalsnøgler og strengnøgler gemmes forskelligt internt, men tilgås ensartet med kantet parentes-notation.

local t = {}
local function myKey() end

t["string"] = 1
t[42] = 2
t[true] = 3
t[myKey] = 4

print(t["string"])  -- 1
print(t[42])        -- 2
print(t[true])      -- 3
print(t[myKey])     -- 4

Sorteret gennemløb

Luas pairs() garanterer ikke rækkefølgen af gennemløbet. Hvis du vil gennemløbe i en bestemt rækkefølge, skal du samle nøglerne i et array, sortere det og derefter gennemløbe det.

local scores = {Alice=95, Bob=87, Carol=91, Dave=78}

local names = {}
for name in pairs(scores) do
  names[#names+1] = name
end
table.sort(names)

for _, name in ipairs(names) do
  print(name, scores[name])
end
-- Alice 95, Bob 87, Carol 91, Dave 78 (sorted)

Mønster med standardværdier

Et nyttigt mønster er en tabel med "standardværdier", der tilgås via en __index-metatabel. Når en nøgle ikke findes i hovedtabellen, slår Lua den op i tabellen med standardværdier. Det muliggør lagdelt konfiguration uden sammenfletning.

local defaults = {timeout=30, retries=3, verbose=false}
local config = {timeout=60}

setmetatable(config, {__index = defaults})

print(config.timeout)  -- 60  (overridden)
print(config.retries)  -- 3   (from defaults)
print(config.verbose)  -- false (from defaults)

Hurtigt tjek

Hvordan fjerner du nøglen "x" fra tabellen t i Lua?

Opsamling: Tabeller som ordbøger

Vigtige punkter:

  • Punkt- og kantet parentes-notation: t.key == t["key"]
  • Enhver værdi, der hverken er nil eller NaN, kan være en nøgle
  • Sæt en nøgle til nil for at slette den
  • Frekvenstælling: t[k] = (t[k] or 0) + 1
  • Sorteret gennemløb: saml nøgler → sortér → gennemløb
  • Brug en __index-metatabel til standardværdier
Gratis at komme i gang

Lær Lua med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
40
Lektioner
159

Ofte stillede spørgsmål

Er lektionen “Tabeller som ordbøger” gratis?

Ja — alle 3 lektioner i læringssporet Lua Academy, inklusive “Tabeller som ordbøger”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Lua Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Tabeller som ordbøger”?

Brug strengnøgler og blandede nøgler til at gemme nøgleværdi-par. Du øver dig i Lua Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Lua Academy?

Der kræves ingen tidligere erfaring. Lua Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “Tabeller som ordbøger”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Lua Academy-lektion?

Ja. Alle Lua Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Tabeller som arrays
  2. Tabeller som ordbøger
  3. Iteration gennem tabeller med pairs og ipairs
  4. Indlejrede tabeller og strukturerede data
← Tilbage til Lua Academy