00
:
00
:
00
:
00
•Corso SEO AI - Usa SEOEMAIL al checkout per il 30% di sconto

Condizionali if/else in Lua

Le istruzioni condizionali sono un elemento fondamentale della programmazione che permettono di eseguire blocchi di codice differenti in base a determinate condizioni. In Lua, le strutture condizionali si basano sulle parole chiave if, elseif, else e then, e ogni blocco condizionale termina con la parola chiave end.

L’Istruzione if

L’istruzione if e la forma piu semplice di controllo condizionale. Esegue un blocco di codice solo se la condizione specificata e vera:

local eta = 20

if eta >= 18 then
    print("Sei maggiorenne")
end

La struttura base e: if condizione then ... end. Il blocco di codice tra then e end viene eseguito solo se la condizione risulta vera.

local temperatura = 35

if temperatura > 30 then
    print("Fa molto caldo oggi!")
    print("Ricordati di bere molta acqua.")
end

-- Il programma continua qui indipendentemente dalla condizione
print("Programma terminato.")

L’Istruzione if-else

L’istruzione if-else permette di definire un blocco alternativo da eseguire quando la condizione e falsa:

local numero = 7

if numero % 2 == 0 then
    print(numero .. " e un numero pari")
else
    print(numero .. " e un numero dispari")
end
-- Output: 7 e un numero dispari

Un esempio pratico con l’autenticazione:

local password_corretta = "lua2026"
local password_inserita = "lua2026"

if password_inserita == password_corretta then
    print("Accesso consentito! Benvenuto.")
else
    print("Password errata. Accesso negato.")
end

L’Istruzione if-elseif-else

Quando ci sono piu condizioni da verificare in sequenza, si utilizza elseif per aggiungere condizioni intermedie:

local voto = 27

if voto >= 30 then
    print("Eccellente!")
elseif voto >= 26 then
    print("Ottimo!")
elseif voto >= 22 then
    print("Buono")
elseif voto >= 18 then
    print("Sufficiente")
else
    print("Insufficiente")
end
-- Output: Ottimo!

Le condizioni vengono valutate dall’alto verso il basso. Appena una condizione risulta vera, il blocco corrispondente viene eseguito e le condizioni successive vengono ignorate:

local ora = 14

if ora < 6 then
    print("Buonanotte!")
elseif ora < 12 then
    print("Buongiorno!")
elseif ora < 18 then
    print("Buon pomeriggio!")
elseif ora < 22 then
    print("Buonasera!")
else
    print("Buonanotte!")
end
-- Output: Buon pomeriggio!

Condizioni Annidate

Le istruzioni condizionali possono essere annidate una dentro l’altra per gestire logiche piu articolate:

local eta = 25
local ha_patente = true

if eta >= 18 then
    print("Sei maggiorenne.")
    if ha_patente then
        print("Puoi guidare un'automobile.")
    else
        print("Non hai la patente, non puoi guidare.")
    end
else
    print("Sei minorenne.")
    if eta >= 14 then
        print("Puoi guidare un ciclomotore con il patentino.")
    else
        print("Non puoi ancora guidare nessun veicolo a motore.")
    end
end

Per evitare un annidamento eccessivo, spesso e preferibile combinare le condizioni con gli operatori logici:

local eta = 25
local ha_patente = true

-- Versione equivalente senza annidamento
if eta >= 18 and ha_patente then
    print("Puoi guidare un'automobile.")
elseif eta >= 18 and not ha_patente then
    print("Sei maggiorenne ma non hai la patente.")
elseif eta >= 14 then
    print("Puoi guidare un ciclomotore con il patentino.")
else
    print("Non puoi ancora guidare.")
end

Truthiness in Lua

In Lua, il concetto di verita (truthiness) e molto semplice e diverso da molti altri linguaggi. La regola fondamentale e:

Solo false e nil sono considerati falsi. Tutti gli altri valori sono considerati veri.

Questo include valori che in altri linguaggi sarebbero falsi:

-- false e nil sono falsi
if false then print("non stampato") end
if nil then print("non stampato") end

-- TUTTO il resto e vero, inclusi:
if 0 then print("0 e vero in Lua!") end           -- stampato!
if "" then print("stringa vuota e vera!") end       -- stampato!
if "false" then print("la stringa 'false' e vera!") end  -- stampato!
if {} then print("tabella vuota e vera!") end       -- stampato!

-- Questo e diverso da Python, JavaScript, ecc.
-- dove 0, "" e {} possono essere falsi

Questa regola rende i controlli molto prevedibili:

local nome = nil

if nome then
    print("Il nome e: " .. nome)
else
    print("Il nome non e stato impostato")
end
-- Output: Il nome non e stato impostato

-- Verificare se una variabile esiste
local configurazione = { debug = false }

if configurazione.debug then
    print("Modalita debug attiva")
else
    print("Modalita debug disattiva")
end
-- Output: Modalita debug disattiva

-- Attenzione: false e nil si comportano diversamente
if configurazione.debug == nil then
    print("debug non e definito")
else
    print("debug e definito (vale: " .. tostring(configurazione.debug) .. ")")
end
-- Output: debug e definito (vale: false)

Operatori Logici nelle Condizioni

Lua supporta tre operatori logici: and, or e not:

local eta = 25
local ha_biglietto = true
local e_vip = false

-- and: entrambe le condizioni devono essere vere
if eta >= 18 and ha_biglietto then
    print("Puoi entrare al concerto")
end

-- or: almeno una condizione deve essere vera
if ha_biglietto or e_vip then
    print("Hai accesso all'evento")
end

-- not: inverte il valore di verita
if not e_vip then
    print("Non sei un VIP")
end

-- Combinazione di operatori
if (eta >= 18 and ha_biglietto) or e_vip then
    print("Accesso consentito")
end

Una particolarita di Lua e che and e or restituiscono uno dei loro operandi, non necessariamente true o false:

-- and restituisce il primo valore falso, o l'ultimo valore
print(1 and 2)       -- 2
print(nil and 2)     -- nil
print(false and 2)   -- false

-- or restituisce il primo valore vero, o l'ultimo valore
print(1 or 2)        -- 1
print(nil or 2)      -- 2
print(false or 2)    -- 2
print(nil or false)  -- false

L’Idioma Ternario: a and b or c

Lua non ha un operatore ternario come il ? : di C o JavaScript. Tuttavia, esiste un idioma comune che sfrutta il comportamento di and e or:

-- Idioma ternario: condizione and valore_se_vero or valore_se_falso
local eta = 20
local stato = (eta >= 18) and "maggiorenne" or "minorenne"
print(stato)  -- maggiorenne

-- Equivalente a:
-- local stato
-- if eta >= 18 then stato = "maggiorenne" else stato = "minorenne" end

-- Altro esempio
local numero = 7
local tipo = (numero % 2 == 0) and "pari" or "dispari"
print(numero .. " e " .. tipo)  -- 7 e dispari

-- Uso con funzioni
local x = -5
local valore_assoluto = (x >= 0) and x or -x
print(valore_assoluto)  -- 5

Attenzione: questo idioma ha una limitazione importante. Non funziona correttamente se il valore di b puo essere false o nil:

-- PROBLEMA: se b e false, l'idioma non funziona
local condizione = true
local risultato = condizione and false or "alternativa"
print(risultato)  -- "alternativa" (SBAGLIATO! ci aspettavamo false)

-- In questo caso, usare un if-else esplicito:
local risultato2
if condizione then
    risultato2 = false
else
    risultato2 = "alternativa"
end
print(risultato2)  -- false (CORRETTO)

Esempi Pratici con Diversi Tipi di Dati

Classificazione di un Carattere

local function classifica_carattere(c)
    if string.match(c, "%d") then
        return "cifra"
    elseif string.match(c, "%u") then
        return "lettera maiuscola"
    elseif string.match(c, "%l") then
        return "lettera minuscola"
    elseif string.match(c, "%s") then
        return "spazio bianco"
    elseif string.match(c, "%p") then
        return "punteggiatura"
    else
        return "altro"
    end
end

print(classifica_carattere("A"))  -- lettera maiuscola
print(classifica_carattere("5"))  -- cifra
print(classifica_carattere("!"))  -- punteggiatura

Confronto di Tipi

local function descrivi_valore(v)
    local t = type(v)

    if t == "number" then
        if v == math.floor(v) then
            print(v .. " e un numero intero")
        else
            print(v .. " e un numero decimale")
        end
    elseif t == "string" then
        if #v == 0 then
            print("Stringa vuota")
        else
            print('"' .. v .. '" e una stringa di ' .. #v .. " caratteri")
        end
    elseif t == "boolean" then
        print("Booleano: " .. tostring(v))
    elseif t == "table" then
        print("Tabella con " .. #v .. " elementi nella parte sequenziale")
    elseif t == "nil" then
        print("Valore nil (nessun valore)")
    else
        print("Tipo: " .. t)
    end
end

descrivi_valore(42)            -- 42 e un numero intero
descrivi_valore(3.14)          -- 3.14 e un numero decimale
descrivi_valore("Ciao")        -- "Ciao" e una stringa di 4 caratteri
descrivi_valore(true)          -- Booleano: true
descrivi_valore({1, 2, 3})    -- Tabella con 3 elementi nella parte sequenziale
descrivi_valore(nil)           -- Valore nil (nessun valore)

Conclusioni

Le istruzioni condizionali in Lua sono semplici e intuitive. La regola di truthiness, dove solo false e nil sono valori falsi, rende i controlli molto prevedibili. L’idioma ternario a and b or c e un pattern utile ma va usato con consapevolezza delle sue limitazioni. Combinando if, elseif, else con gli operatori logici and, or e not, e possibile esprimere qualsiasi logica condizionale in modo chiaro e leggibile.