Congelare le tabelle costanti
Fa parte della sezione Introduzione a Luau del percorso Lua di Coddy. Lezione 59 di 80.
Una tabella di costanti ha un punto debole: è pur sempre una tabella ordinaria. Qualsiasi codice, ovunque, può scrivere UserRole.Admin = 99 e le tue «costanti» smettono silenziosamente di essere costanti.
Luau colma questa lacuna con table.freeze. Il congelamento rende una tabella di sola lettura durante l'esecuzione: qualsiasi tentativo di aggiungere, modificare o rimuovere un campo genera un errore. La convenzione consiste nel congelare la tabella proprio nel punto in cui viene creata: table.freeze restituisce la stessa tabella, pronta per essere assegnata:
local Color = table.freeze({
Red = 1,
Green = 2,
Blue = 3,
})
print(Color.Red) -- 1: la lettura funziona come al solito
Color.Gold = 4 -- ✗ errore: tentativo di modificare una tabella di sola letturaA differenza di tutto il resto visto finora in questo corso, questa è una protezione durante l'esecuzione: un errore reale nel momento stesso in cui viene eseguita la scrittura, non un avviso in fase di modifica. Protegge persino da codice che il controllo dei tipi non ha mai analizzato.
Vale la pena conoscere due funzioni complementari: table.isfrozen(t) restituisce un valore che indica se una tabella è congelata, e il congelamento è superficiale: le tabelle annidate restano modificabili, a meno che non le congeli anche tu. Inoltre, non puoi scongelare una tabella: una volta congelata, resta tale.
Una tabella di costanti congelata, insieme a un'unione di valori letterali per i parametri, costituisce l'enum Luau completo: valori di runtime con nome che nessuno può manomettere e controlli in fase di modifica ovunque vengano usati.
Sfida
FacileCrea una tabella costante che nulla possa modificare.
- Crea
local Size = table.freeze({Small = 1, Medium = 2, Large = 3}). - Stampa
Size.Largeetable.isfrozen(Size). - Memorizza
pcall(function() Size.Huge = 4 end)inlocal oke stampaok.
Premi Esegui codice: l'output mostra 3, true e false.
Provalo tu
-- 1) local Size = table.freeze({...})
-- 2) stampa Size.Large e table.isfrozen(Size)
-- 3) memorizza in ok ciò che pcall restituisce per la scrittura non consentita, poi stampalo
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 parametri e valori restituitiTipizzare le funzioni anonimeFunzioni che non restituiscono nullaParametri opzionaliValori predefiniti dei parametriValori predefiniti per i booleaniFunzioni variadicheDefinire i tipi di funzioneRiepilogo: funzioni tipizzate7Progetto: Gestore di attività tipizzato
Progetto: La struttura di un'attivitàFunzione per aggiungere un'attività2Tipi fondamentali
Numero, stringa e booleanoIl tipo 'any': una via di fugaIl tipo 'unknown'Tipi nil e opzionaliL’inferenza dei tipi in praticaAnnotazioni 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 Luau3Tabelle tipizzate: array e mappe
Array tipizzatiAggiungere e leggere elementiChe cos'è un tipo map?Dichiarare e accedere alle mappeIterare sulle tabelleTabelle con forme misteLeggere una grigliaCreare una grigliatable.unpackRiepilogo: array e mappeEsercitati da solo: Compilatore Luau online