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à strictLa 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"
endQuando 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.
Sfida
FacileElabora i campi del profilo utente che potrebbero essere mancanti. Inizia il tuo file con --!strict.
getDisplayName(fullName: string?): string: restituiscefullNamese non ènil, altrimentiAnonymous User.formatEmail(email: string?): string: restituisce l'email convertita in minuscolo (string.lower) se non ènil, altrimentiNo email provided.getUserInfo(name: string?, email: string?): string: usa entrambe le funzioni e restituisceName: [processed name], Email: [processed email].
Quindi stampa, ciascuno su una riga:
getDisplayName("John Smith")getDisplayName(nil)formatEmail("ALICE@EXAMPLE.COM")formatEmail(nil)getUserInfo("Bob Johnson", "bob@test.com")getUserInfo(nil, nil)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
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Introduzione a Luau
1Per iniziare con Luau
Che cos'è Luau?Perché usare Luau?Il tuo primo codice LuauVerifica dei tipi e modalità di erroreRiepilogo: introduzione a Luau4Lavorare con le funzioni
Tipizzare i parametri e i valori restituitiTipizzare le funzioni anonimeFunzioni che non restituiscono nullaParametri opzionaliValori predefiniti dei parametriFunzioni variadicheDefinire i tipi di funzioneRiepilogo: funzioni tipizzate2Tipi fondamentali
Tipi di base: num, str, boolIl tipo 'any': una via di fugaIl tipo 'unknown'Nil e tipi opzionaliL'inferenza dei tipi in azioneAnnotazioni esplicite dei tipiRipasso: esercizi sui tipi fondamentali5Alias, unioni e intersezioni
Alias di tipo per i primitiviTipi unioneLavorare con i tipi unioneTipi letteraliTipi intersezioneCombinare gli alias di tipoRiepilogo: combinazioni avanzate di tipi8Gli enum, secondo lo stile di Luau
Il pattern degli enum in LuauEnum numerici con le tabelleEnum di stringhe come unioniUsare enum con unioni di valori letteraliCongelare le tabelle costantiRiepilogo: gli enum, secondo lo stile di Luau11Argomenti avanzati
Asserzioni di tipoControlli di tipo con typeofIl tipo neverSicurezza rispetto a nil in modalità strictFirme di indiceRiepilogo: perfezionare i tipi3Tabelle tipizzate: array e mappe
Array tipizzatiAggiungere e leggere elementiChe cos'è un tipo Map?Dichiarare e accedere alle mappeIterare sulle tabelleTabelle con strutture misteArray tipizzati multidimensionalitable.unpack e argomenti variabiliRiepilogo: array e mappeEsercitati da solo: Compilatore Luau online