Sécurité contre les valeurs nulles en mode strict
Fait partie de la section Introduction à Luau du Journey Lua de Coddy. Leçon 77 sur 80.
Le plantage Lua le plus courant est "attempt to index nil" : du code qui supposait qu’une valeur existait alors que ce n’était pas le cas. La réponse de Luau est la discipline de nil : sous --!strict, un string simple ne peut jamais être nil. Si nil est une possibilité réelle, le type doit l’indiquer avec ? :
--!strict
local nickname: string? = nil -- ok : string OU nil
local username: string = nil -- ✗ erreur de type en mode strictCette discipline fonctionne dans les deux sens : avec un string?, le mode strict ne te laissera pas l’utiliser comme une chaîne tant que tu n’as pas écarté nil. L’outil standard est une simple comparaison, qui affine le type comme le ferait une vérification avec typeof :
local function shout(name: string?): string
if name ~= nil then
return string.upper(name) -- name est une chaîne de caractères ici
end
return "NOBODY"
endQuand nil serait un bogue plutôt qu’un cas valide, utilise assert : après assert(x ~= nil), l’analyseur considère que x n’est pas nil pour le reste de la portée et, à l’exécution, l’assertion provoque un plantage immédiatement, au point où l’hypothèse est erronée, au lieu de le faire quelque part beaucoup plus loin.
Le résultat : l’analyseur t’oblige à traiter chaque valeur « potentiellement manquante » pendant que tu modifies le code, et l’erreur à l’exécution ne se produit tout simplement jamais.
Défi
FacileDonne un nom auquel il pourrait manquer une valeur de repli sûre.
- Garde
--!strictsur la première ligne. - Écris
local function getDisplayName(fullName: string?): stringqui renvoiefullNamelorsqu’il n’est pasnil, sinon"Anonymous User". - Affiche
getDisplayName("John Smith")etgetDisplayName(nil).
Appuie sur Run Code : la sortie affiche John Smith et Anonymous User.
Essayez vous-même
--!strict
-- 1) getDisplayName(fullName: string?): string, en utilisant "Anonymous User" comme valeur de repli
-- 2) affiche le résultat pour "John Smith" et nil
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 Luau11Sujets avancés
Assertions de typeGardes de type avec typeofLe type neverSécurité contre les valeurs nulles en mode strictSignatures d’indexRécapitulatif : types des valeurs de configurationRécapitulatif : affiner les types3Tables 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