Coercizione e conversione dei tipi
Impari la coercizione automatica tra stringhe e numeri e l'uso esplicito di tonumber/tostring.
Coercizione e conversione dei tipi è una lezione Lua Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Lua Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Lua Academy include 4 lezioni in totale.
Che cos'è la coercizione dei tipi?
La coercizione dei tipi è la conversione automatica di un valore da un tipo a un altro quando il contesto lo richiede. Lua esegue la coercizione in due direzioni specifiche: da stringa a numero nei contesti aritmetici e da numero a stringa nei contesti di concatenazione.
A differenza di JavaScript, la coercizione di Lua è limitata e prevedibile. Lua non converte automaticamente i booleani in numeri né le tabelle in stringhe.
-- 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!Regole della coercizione da stringa a numero
Quando una stringa compare in un'espressione aritmetica, Lua tenta di convertirla in un numero. Se la stringa non rappresenta un numero valido, viene generato un errore a runtime. Tra le stringhe numeriche valide rientrano gli interi ("42"), i numeri in virgola mobile ("3.14"), i numeri esadecimali ("0xff") e la notazione scientifica ("1e3").
Le stringhe con spazi bianchi iniziali o finali sono accettate: Lua li rimuove durante la coercizione.
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 valueCoercizione da numero a stringa
Quando si concatena un numero con .., Lua converte automaticamente il numero in una stringa. Gli interi diventano la loro rappresentazione decimale; ai numeri in virgola mobile possono essere aggiunte cifre decimali. Per controllare con precisione il formato, utilizzi sempre tostring() o string.format() invece di affidarsi alla coercizione implicita.
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.0tonumber(): conversione esplicita
tonumber(v) converte esplicitamente un valore in un numero. In caso di successo restituisce il numero convertito, mentre restituisce nil se la conversione non riesce: non genera mai un errore. È possibile specificare una base opzionale (2–36) per l'analisi degli interi, consentendo conversioni binarie, ottali ed esadecimali.
Quando elabora dati immessi dall'utente, verifichi sempre che il valore restituito da tonumber() non sia nil.
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(): conversione esplicita
tostring(v) converte qualsiasi valore in una stringa. Per i numeri produce una stringa in notazione decimale o scientifica. Per i booleani produce "true" o "false". Per nil restituisce "nil". Per tabelle e funzioni restituisce un indirizzo come "table: 0x...", a meno che non sia definito un metametodo __tostring.
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: nilmath.tointeger()
math.tointeger(x) (Lua 5.3+) converte un numero in virgola mobile in un intero solo se il valore ha una rappresentazione intera esatta. Se la conversione comportasse una perdita di precisione, restituisce nil. È più sicuro di math.floor(), che ha sempre successo ma può troncare silenziosamente.
Utilizzi questa funzione quando è necessaria una validazione rigorosa degli interi, ad esempio per interfacciarsi con API che richiedono interi esatti.
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")Coercizione nei confronti
Lua non applica la coercizione dei tipi nei confronti di uguaglianza. 1 == "1" è sempre false perché gli operandi hanno tipi diversi. Tuttavia, gli operatori relazionali (<, > ecc.) attivano la coercizione tra stringhe e numeri, ma solo se entrambi gli operandi sono dello stesso tipo. Combinare tipi diversi nei confronti d'ordine genera un errore.
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 stringPratica: analizzare i dati immessi dall'utente
Nei programmi Lua è molto comune leggere una stringa dall'input dell'utente (ad esempio tramite io.read()) e convertirla in un numero. Utilizzi sempre tonumber() e verifichi che il risultato non sia nil, così da gestire con eleganza gli input non validi invece di causare un arresto del programma.
-- 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: abcProblemi di precisione tra interi e numeri in virgola mobile
I numeri in virgola mobile hanno una precisione limitata. Le operazioni che combinano interi e numeri in virgola mobile possono produrre risultati imprevisti a causa della rappresentazione IEEE 754. Il più grande intero rappresentabile esattamente come double è 2^53 = 9.007.199.254.740.992. Gli interi oltre questo limite perdono precisione quando vengono memorizzati come numeri in virgola mobile.
In Lua 5.3+, gli interi nativi a 64 bit supportano valori esatti fino a 2^63-1, un limite molto più alto. Utilizzi sempre l'aritmetica intera quando la precisione esatta è importante.
-- 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)) -- floatConversioni con formattazione delle stringhe
string.format() è lo strumento più potente per convertire numeri in stringhe quando è necessario controllare precisione, riempimento e notazione. Utilizza gli specificatori di formato di printf del linguaggio C. Lo utilizzi per la visualizzazione, l'output su file e ogni situazione in cui la rappresentazione predefinita di tostring() non è sufficiente.
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=10Verifica rapida
Che cosa restituisce tonumber("hello") in Lua?
Riepilogo: coercizione e conversione dei tipi
Che cosa ha imparato:
- Lua converte automaticamente le stringhe in numeri nelle operazioni aritmetiche e i numeri in stringhe nella concatenazione
tonumber()restituisce nil in caso di errore: lo verifichi sempre!tostring()converte in modo sicuro qualsiasi valore in una stringa- L'uguaglianza (
==) non applica mai la coercizione: tipi diversi non sono mai uguali - Utilizzi
string.format()per formattare con precisione i numeri - Il limite di precisione dei numeri in virgola mobile è 2^53; utilizzi gli interi nativi per i valori grandi esatti
Successivamente: controllo del flusso con if/elseif/else e i cicli.
Impara Lua con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 40
- Lezioni
- 159
Domande Frequenti
La lezione «Coercizione e conversione dei tipi» è gratuita?
Sì — il testo completo di «Coercizione e conversione dei tipi» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Lua Academy, passa a CoddyKit PRO. Il corso Lua Academy include 4 lezioni in totale.
Cosa imparerò in «Coercizione e conversione dei tipi»?
Impari la coercizione automatica tra stringhe e numeri e l'uso esplicito di tonumber/tostring. Eserciti Lua Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Lua Academy?
Non è richiesta alcuna esperienza precedente. Lua Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «Coercizione e conversione dei tipi»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Lua Academy?
Sì. Ogni lezione Lua Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Panoramica dei tipi di dati Lua
- Dichiarare variabili in Lua
- Operatori aritmetici e relazionali
- Coercizione e conversione dei tipi