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 constante a une faiblesse : c'est toujours 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. 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'idiome consiste à geler 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 le reste de ce cours jusqu'à présent, il s'agit d'une protection à l'exécution : une véritable erreur au moment où l'écriture est exécutée, et non d'un avertissement lors de la modification. Elle protège même contre du code que le vérificateur de types n'a jamais analysé.

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

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

challenge icon

Défi

Facile

Crée une table constante figée nommée Color, construis-la et fige-la en une seule étape avec table.freeze, contenant :

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

Crée une table simple (non figée) nommée settings avec un champ volume = 5.

Affiche, chacune sur sa propre ligne :

  1. Color.Red
  2. Color.Blue
  3. si Color est figée (table.isfrozen)
  4. si settings est figée
  5. le résultat de la tentative d’ajout d’un champ à Color dans pcall : appelle pcall(function() Color.Gold = 4 end) et affiche le booléen 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

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