Menu
Coddy logo textTech

Congelare le tabelle costanti

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

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. L'idioma consiste nel congelare la tabella proprio quando 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 lettura

A 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 durante la modifica del codice. Protegge persino dal codice che il controllo dei tipi non ha mai esaminato.

Due funzioni correlate da conoscere: 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 congelata.

Una tabella di costanti congelata insieme a un'unione di valori letterali per i parametri costituisce l'enum Luau completo: valori nominati durante l'esecuzione che nessuno può manomettere e controlli durante la modifica del codice ovunque vengano usati.

challenge icon

Sfida

Facile

Crea una tabella costante congelata chiamata Color, creala e congelala in un solo passaggio con table.freeze, contenente:

  • Red = 1
  • Green = 2
  • Blue = 3

Crea una tabella normale (non congelata) chiamata settings con un campo volume = 5.

Stampa, ciascuno su una riga separata:

  1. Color.Red
  2. Color.Blue
  3. se Color è congelata (table.isfrozen)
  4. se settings è congelata
  5. il risultato del tentativo di aggiungere un campo a Color all'interno di pcall: chiama pcall(function() Color.Gold = 4 end) e stampa il valore booleano restituito

Provalo tu

-- Scrivi il codice qui
-- 1) local Color = table.freeze({Red = 1, Green = 2, Blue = 3})
-- 2) local settings = {volume = 5}
-- 3) stampa Color.Red, Color.Blue e i risultati di entrambe le chiamate a isfrozen
-- 4) usa pcall per tentare la scrittura vietata e stampa il valore booleano restituito
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