Menu
CoddyTech

Geler les tables de constantes

Fait partie de la section Introduction à Luau du Journey Lua de Coddy. Leçon 59 sur 80.

Une table de constantes a un point faible : cela reste une table ordinaire. N’importe quel code, où qu’il se trouve, peut écrire UserRole.Admin = 99, et vos « constantes » cessent discrètement d’être constantes.

Luau comble cette lacune avec table.freeze. Le gel rend une table accessible en lecture seule à l’exécution : toute tentative d’ajouter, de modifier ou de supprimer un champ déclenche une erreur. L’usage courant consiste à geler la table dès sa création : 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 le reste de ce cours jusqu’ici, il s’agit d’une protection à l’exécution : une véritable erreur dès que l’écriture est exécutée, et non d’un avertissement pendant la modification du code. Elle protège même contre du code que le vérificateur de types n’a jamais examiné.

Deux fonctions complémentaires à connaître : table.isfrozen(t) indique si une table est gelée, et le gel est superficiel : les tables imbriquées restent modifiables, sauf si vous les gelez également. Vous ne pouvez pas non plus dégeler une table : une fois gelée, elle le reste.

Une table de constantes gelée associée à une union littérale pour les paramètres constitue l’énumération Luau complète : des valeurs nommées à l’exécution que personne ne peut altérer, et une vérification lors de la modification du code partout où elles sont utilisées.

challenge icon

Défi

Facile

Crée une table constante que rien ne peut modifier.

  1. Crée local Size = table.freeze({Small = 1, Medium = 2, Large = 3}).
  2. Affiche Size.Large et table.isfrozen(Size).
  3. Stocke pcall(function() Size.Huge = 4 end) dans local ok et affiche ok.

Appuie sur Exécuter le code : la sortie affiche 3, true et false.

Essayez vous-même

-- 1) local Size = table.freeze({...})
-- 2) afficher Size.Large et table.isfrozen(Size)
-- 3) stocker dans ok ce que pcall renvoie pour l’écriture interdite, puis l’afficher

Toutes les leçons de Introduction à Luau

Entraînez-vous par vous-même : Compilateur Luau en ligne