Lua Academy · Lektion

Typekoercion og -konvertering

Lær automatisk koercion mellem strenge og tal samt eksplicit brug af tonumber/tostring.

Lektion 4 af 412 trin

Typekoercion og -konvertering er en gratis Lua Academy-lektion på CoddyKit. Dette er lektion 4 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.

Hvad er typekonvertering?

Typekonvertering er den automatiske konvertering af en værdi fra én type til en anden, når konteksten kræver det. Lua udfører konvertering i to bestemte retninger: streng til tal i aritmetiske kontekster og tal til streng i sammenkædningskontekster.

I modsætning til JavaScript er typekonvertering i Lua begrænset og forudsigelig. Booleske værdier konverteres ikke automatisk til tal, og tabeller konverteres ikke automatisk til strenge.

-- String to number (arithmetic context)
print("10" + 5)     -- 15  (coerced)
print("3.14" * 2)   -- 6.28

-- Number to string (concatenation context)
print(10 .. "px")   -- 10px
print(3.14 .. "!")  -- 3.14!

-- No boolean coercion
-- print(true + 1)  -- ERROR!

Regler for konvertering fra streng til tal

Når en streng indgår i et aritmetisk udtryk, forsøger Lua at konvertere den til et tal. Hvis strengen ikke repræsenterer et gyldigt tal, opstår der en kørselsfejl. Gyldige numeriske strenge omfatter heltal ("42"), kommatal ("3.14"), hexadecimale tal ("0xff") og videnskabelig notation ("1e3").

Strenge med indledende eller afsluttende mellemrum accepteres — Lua fjerner mellemrummene under konverteringen.

print("42" + 0)      -- 42    (integer)
print("3.14" + 0)    -- 3.14  (float)
print("0xff" + 0)    -- 255   (hex)
print("  10  " + 0)  -- 10    (whitespace ok)
print("1e3" + 0)     -- 1000.0

-- This will error:
-- print("hello" + 0)  -- attempt to perform arithmetic on a string value

Konvertering fra tal til streng

Når du sammenkæder et tal med .., konverterer Lua automatisk tallet til en streng. Heltal bliver til deres decimalrepræsentation, mens kommatal kan få decimaler. Hvis du vil have præcis kontrol over formatet, skal du altid bruge tostring() eller string.format() i stedet for at stole på implicit konvertering.

print(10 .. "!")       -- 10!
print(3.14 .. "!")     -- 3.14!
print(1/3 .. "!")      -- 0.33333333333333!

-- Explicit is better for precision
print(string.format("%.2f", 1/3))  -- 0.33
print(tostring(10))                -- 10
print(tostring(10.0))              -- 10.0

tonumber(): Eksplicit konvertering

tonumber(v) konverterer eksplicit en værdi til et tal. Ved succes returnerer den det konverterede tal, og hvis konverteringen mislykkes, returnerer den nil — den udløser aldrig en fejl. Du kan angive en valgfri base (2–36) ved fortolkning af heltal, hvilket muliggør binære, oktale og hexadecimale konverteringer.

Kontrollér altid returværdien fra tonumber() for nil, når du behandler brugerinput.

print(tonumber("42"))      -- 42
print(tonumber("3.14"))    -- 3.14
print(tonumber("0xFF"))    -- 255
print(tonumber("hello"))   -- nil (no error!)
print(tonumber(true))      -- nil

-- Base conversion
print(tonumber("ff", 16))  -- 255
print(tonumber("11", 2))   -- 3   (binary)
print(tonumber("77", 8))   -- 63  (octal)

tostring(): Eksplicit konvertering

tostring(v) konverterer enhver værdi til en streng. For tal producerer den en streng i decimal eller videnskabelig notation. For boolske værdier producerer den "true" eller "false". For nil returnerer den "nil". For tabeller og funktioner returnerer den en adresse som "table: 0x...", medmindre der er defineret en __tostring-metamethod.

print(tostring(42))         -- 42
print(tostring(3.14))       -- 3.14
print(tostring(true))       -- true
print(tostring(false))      -- false
print(tostring(nil))        -- nil
print(tostring({}))         -- table: 0x...

-- Useful for safe concatenation
local val = nil
local msg = "Value: " .. tostring(val)
print(msg)   -- Value: nil

math.tointeger()

math.tointeger(x) (Lua 5.3+) konverterer kun et kommatal til et heltal, hvis værdien har en nøjagtig heltalsrepræsentation. Hvis konverteringen vil medføre tab af præcision, returnerer den nil. Dette er sikrere end math.floor(), som altid lykkes, men muligvis afkorter værdien uden at gøre opmærksom på det.

Brug dette, når du har brug for streng validering af heltal, f.eks. ved integration med API'er, der kræver nøjagtige heltal.

print(math.tointeger(5.0))   -- 5   (exact)
print(math.tointeger(5.5))   -- nil (not exact)
print(math.tointeger(2^53))  -- 9007199254740992

-- Contrast with math.floor
print(math.floor(5.9))       -- 5   (truncates)
print(math.floor(5.0))       -- 5

-- Check before use
local n = math.tointeger(val) or error("need integer")

Typekonvertering i sammenligninger

Lua konverterer ikke typer ved lighedssammenligninger. 1 == "1" er altid false, fordi operanderne har forskellige typer. Relationelle operatorer (<, > osv.) udløser dog konvertering mellem strenge og tal — men kun hvis begge operander har samme type. Hvis du blander typer i ordenssammenligninger, opstår der en fejl.

print(1 == "1")    -- false (no coercion)
print(1 == 1.0)    -- true  (int/float equal)

-- Ordering: same type only
print("abc" < "abd")  -- true (string compare)
print(1 < 2)          -- true (number compare)

-- This ERRORS: mixing string and number
-- print(1 < "2")  -- attempt to compare number with string

Praktisk: Fortolkning af brugerinput

Et meget almindeligt mønster i Lua-programmer er at læse en streng fra brugerinput (f.eks. via io.read()) og konvertere den til et tal. Brug altid tonumber(), og kontrollér for nil, så ugyldigt input håndteres korrekt i stedet for at få programmet til at gå ned.

-- Safe input parsing pattern
local function parseNumber(input)
  local n = tonumber(input)
  if n == nil then
    return nil, "Invalid number: " .. tostring(input)
  end
  return n, nil
end

local val, err = parseNumber("42")
print(val, err)   -- 42  nil

local val2, err2 = parseNumber("abc")
print(val2, err2) -- nil  Invalid number: abc

Faldgruber ved præcision for heltal og kommatal

Kommatal har begrænset præcision. Operationer, der blander heltal og kommatal, kan give uventede resultater på grund af IEEE 754-repræsentationen. Det største heltal, der kan repræsenteres nøjagtigt som et double, er 2^53 = 9,007,199,254,740,992. Heltal over denne grænse mister præcision, når de gemmes som kommatal.

I Lua 5.3+ understøtter indbyggede 64-bit-heltal nøjagtige værdier op til 2^63-1, hvilket er betydeligt større. Brug altid heltalsaritmetik, når nøjagtighed er vigtig.

-- Float precision limit
print(2^53)            -- 9.007...e+15
print(2^53 + 1 == 2^53) -- true (precision lost!)

-- Integer stays exact
local big = math.maxinteger
print(big)             -- 9223372036854775807
print(math.type(big))  -- integer

-- Mixing promotes to float
print(math.type(1 + 1.0))  -- float

Konvertering af strengformat

string.format() er det mest effektive værktøj til konvertering fra tal til streng, når du har brug for kontrol over præcision, udfyldning og notation. Den følger C's formatangivelser for printf. Brug den til visning, output til filer og alle steder, hvor standardrepræsentationen fra tostring() ikke er tilstrækkelig.

print(string.format("%d", 255))      -- 255
print(string.format("%x", 255))      -- ff
print(string.format("%05d", 42))     -- 00042
print(string.format("%.2f", 3.14159)) -- 3.14
print(string.format("%e", 12345.0))  -- 1.234500e+04
print(string.format("%s=%d", "x", 10)) -- x=10

Hurtigt tjek

Hvad returnerer tonumber("hello") i Lua?

Opsummering: Typekonvertering og konvertering

Det har du lært:

  • Lua konverterer automatisk strenge til tal i aritmetik og tal til strenge ved sammenkædning
  • tonumber() returnerer nil ved fejl — kontrollér altid resultatet!
  • tostring() konverterer sikkert enhver værdi til en streng
  • Lighed (==) udfører aldrig typekonvertering — værdier med forskellige typer er aldrig ens
  • Brug string.format() til præcis formatering af tal
  • Præcisionen for kommatal er begrænset til 2^53; brug indbyggede heltal til store nøjagtige værdier

Næste emne: styring af programforløbet med if/elseif/else og løkker.

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 “Typekoercion og -konvertering” gratis?

Ja — alle 3 lektioner i læringssporet Lua Academy, inklusive “Typekoercion og -konvertering”, 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 “Typekoercion og -konvertering”?

Lær automatisk koercion mellem strenge og tal samt eksplicit brug af tonumber/tostring. 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 4 af 4.

Hvor lang tid tager lektionen “Typekoercion og -konvertering”?

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. Oversigt over Lua-datatyper
  2. Deklarering af variabler i Lua
  3. Aritmetiske operatorer og relationsoperatorer
  4. Typekoercion og -konvertering
← Tilbage til Lua Academy