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 seuleContrairement à 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.
Défi
FacileCrée une table constante que rien ne peut modifier.
- Crée
local Size = table.freeze({Small = 1, Medium = 2, Large = 3}). - Affiche
Size.Largeettable.isfrozen(Size). - Stocke
pcall(function() Size.Huge = 4 end)danslocal oket afficheok.
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
1Premiers pas avec Luau
Qu'est-ce que Luau ?Pourquoi utiliser Luau ?Votre premier code LuauVérification de type et modes d'erreurRécapitulatif : Introduction à Luau4Travailler avec les fonctions
Typer les paramètres et les valeurs de retourTyper les fonctions anonymesFonctions sans valeur de retourParamètres optionnelsValeurs par défaut des paramètresValeurs par défaut pour les booléensFonctions variadiquesDéfinir des types de fonctionsRécapitulatif : fonctions typées7Projet : gestionnaire de tâches typé
Projet : la structure d’une tâcheFonction pour ajouter une tâche2Types fondamentaux
Nombre, chaîne de caractères et booléenLe type « any » : une échappatoireLe type « unknown »Types nil et optionnelsL’inférence de types en actionAnnotations de type explicitesRécapitulatif : exercices sur les types fondamentaux5Alias, unions et intersections
Alias de types pour les types primitifsTypes unionsTravailler avec les types unionsTypes littérauxTypes intersectionsCombinaison d'alias de typesRécapitulatif : Combinaisons de types avancées8Les Enums, à la manière de Luau
Le pattern Enum dans LuauEnums numériques avec des tablesEnums de chaînes comme unionsUtiliser des Enums d'unions littéralesGeler les tables de constantesRécapitulatif : Les Enums, à la manière de Luau3Tables typées : tableaux et maps
Tableaux typésAjouter et lire des élémentsQu’est-ce qu’un type Map ?Déclarer et accéder aux mapsParcourir les tablesTables de formes mixtesLire une grilleConstruire une grilletable.unpackRécapitulatif : tableaux et mapsEntraînez-vous par vous-même : Compilateur Luau en ligne