Menu
Coddy logo textTech

Geler les tables de constantes

Fait partie de la section Introduction à Luau du Journey Lua de Coddy — leçon 55 sur 73.

Une table de constantes a une faiblesse : cela reste une table ordinaire. N'importe quel code, n'importe où, peut écrire UserRole.Admin = 99 — et vos "constantes" cessent discrètement d'être constantes.

Luau comble cette lacune avec table.freeze. Congeler (freeze) rend une table en lecture seule à l'exécution : toute tentative d'ajouter, modifier ou supprimer un champ lève une erreur. L'usage veut qu'on gèle la table au moment même où elle est construite — table.freeze renvoie la même table, prête à être assignée :

local Color = table.freeze({
    Red = 1,
    Green = 2,
    Blue = 3,
})

print(Color.Red) -- 1: la lecture fonctionne comme d'habitude
Color.Gold = 4   -- ✗ erreur : tentative de modification d'une table en lecture seule

Contrairement à tout ce que nous avons vu dans ce cours jusqu'à présent, il s'agit d'une protection à l'exécution — une véritable erreur au moment où l'écriture s'exécute, et non un avertissement au moment de l'édition. Elle protège même contre du code que le vérificateur de types n'a jamais vu.

Deux fonctions complémentaires méritent d'être connues : table.isfrozen(t) indique si une table est gelée, et le gel est superficiel (shallow) — les tables imbriquées restent mutables à moins que vous ne les geliez aussi. Il est également impossible de dégeler : une fois gelée, une table le reste.

Une table de constantes gelée combinée à une union littérale pour les paramètres forme l'enum Luau complet : des valeurs nommées à l'exécution que personne ne peut altérer, et une vérification au moment de l'édition partout où elles sont utilisées.

challenge icon

Défi

Facile

Créez une table constante gelée nommée Color — construisez-la et gelez-la en une seule étape avec table.freeze — contenant :

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

Créez une table ordinaire (non gelée) nommée settings avec un champ volume = 5.

Affichez, chacun sur sa propre ligne :

  1. Color.Red
  2. Color.Blue
  3. si Color est frozen (table.isfrozen)
  4. si settings est frozen
  5. le résultat de la tentative d'ajout d'un champ à Color à l'intérieur de pcall — appelez pcall(function() Color.Gold = 4 end) et affichez le boolean qu'il renvoie

Essayez vous-même

-- Écrivez le code ici
-- 1) local Color = table.freeze({Red = 1, Green = 2, Blue = 3})
-- 2) local settings = {volume = 5}
-- 3) print Color.Red, Color.Blue, les deux résultats isfrozen
-- 4) pcall l'écriture interdite et print le booléen retourné
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Introduction à Luau