Menu
Coddy logo textTech

Sicurezza rispetto a nil in modalità strict

Fa parte della sezione Introduzione a Luau del percorso Lua di Coddy. Lezione 71 di 73.

Il crash più comune in Lua è "attempt to index nil": codice che dava per scontato che un valore esistesse quando non era così. La risposta di Luau è la disciplina di nil: con --!strict, una semplice string non può mai essere nil. Se nil è una possibilità concreta, il tipo deve indicarlo con ?:

--!strict
local nickname: string? = nil   -- ok: string O nil
local username: string = nil    -- ✗ errore di tipo in modalità strict

La disciplina vale in entrambi i sensi: se hai una string?, la modalità strict non ti permette di usarla come stringa finché non hai escluso nil. Lo strumento standard è un semplice confronto, che restringe il tipo proprio come una verifica con typeof:

local function shout(name: string?): string
    if name ~= nil then
        return string.upper(name) -- name è una stringa qui
    end
    return "NOBODY"
end

Quando nil sarebbe un bug anziché un caso valido, usa assert: dopo assert(x ~= nil), il controllo dei tipi considera x non nullo per il resto dello scope e, a runtime, l'asserzione genera un errore subito, nel punto in cui viene meno l'ipotesi, invece che molto più avanti.

Il vantaggio: il controllo dei tipi ti obbliga a gestire ogni valore che "potrebbe mancare" mentre scrivi il codice, e l'errore a runtime semplicemente non si verifica mai.

challenge icon

Sfida

Facile

Elabora i campi del profilo utente che potrebbero essere mancanti. Inizia il tuo file con --!strict.

  • getDisplayName(fullName: string?): string: restituisce fullName se non è nil, altrimenti Anonymous User.
  • formatEmail(email: string?): string: restituisce l'email convertita in minuscolo (string.lower) se non è nil, altrimenti No email provided.
  • getUserInfo(name: string?, email: string?): string: usa entrambe le funzioni e restituisce Name: [processed name], Email: [processed email].

Quindi stampa, ciascuno su una riga:

  1. getDisplayName("John Smith")
  2. getDisplayName(nil)
  3. formatEmail("ALICE@EXAMPLE.COM")
  4. formatEmail(nil)
  5. getUserInfo("Bob Johnson", "bob@test.com")
  6. getUserInfo(nil, nil)
  7. getUserInfo("Sarah Wilson", nil)

Provalo tu

--!strict
-- Scrivi il codice qui
-- 1) getDisplayName(fullName: string?): string — controlla se è nil, usa "Anonymous User" come valore predefinito
-- 2) formatEmail(email: string?): string — usa string.lower oppure "No email provided"
-- 3) getUserInfo(name: string?, email: string?): string — combina entrambi
-- 4) stampa le sette chiamate di test dell'esercizio
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Introduzione a Luau

Esercitati da solo: Compilatore Luau online