Sécurité contre les valeurs nulles en mode strict
Fait partie de la section Introduction à Luau du Journey Lua de Coddy. Leçon 71 sur 73.
Le plantage Lua le plus courant est « tentative d’indexation de 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 : avec --!strict, un simple string 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 vous laissera pas l’utiliser comme une chaîne tant que vous n’aurez pas écarté nil. L’outil standard est une simple comparaison, qui effectue une restriction de type tout comme une garde typeof :
local function shout(name: string?): string
if name ~= nil then
return string.upper(name) -- name est string ici
end
return "NOBODY"
endLorsque nil serait un bug plutôt qu’un cas valide, utilisez assert : après assert(x ~= nil), le vérificateur considère que x n’est pas nil pour le reste de la portée et, à l’exécution, l’assertion provoque rapidement un plantage, au point où l’hypothèse erronée s’est produite, plutôt que bien plus loin.
Le bénéfice : le vérificateur vous oblige à gérer chaque valeur « potentiellement manquante » pendant que vous modifiez le code, et l’erreur d’exécution ne se produit tout simplement jamais.
Défi
FacileTraitez les champs du profil utilisateur qui pourraient être manquants. Commencez votre fichier par --!strict.
getDisplayName(fullName: string?): string: renvoiefullNames'il n'est pasnil, sinonAnonymous User.formatEmail(email: string?): string: renvoie l'adresse e-mail en minuscules (string.lower) si elle n'est pasnil, sinonNo email provided.getUserInfo(name: string?, email: string?): string: utilise les deux fonctions et renvoieName: [processed name], Email: [processed email].
Imprimez ensuite, chacun sur sa propre ligne :
getDisplayName("John Smith")getDisplayName(nil)formatEmail("ALICE@EXAMPLE.COM")formatEmail(nil)getUserInfo("Bob Johnson", "bob@test.com")getUserInfo(nil, nil)getUserInfo("Sarah Wilson", nil)
Essayez vous-même
--!strict
-- Écrire le code ici
-- 1) getDisplayName(fullName: string?): string — nil-check, fallback "Anonymous User"
-- 2) formatEmail(email: string?): string — string.lower or "No email provided"
-- 3) getUserInfo(name: string?, email: string?): string — combiner les deux
-- 4) afficher les sept appels de test de la tâche
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
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
Typage des paramètres et valeurs de retourTypage des fonctions anonymesFonctions ne retournant rienParamètres optionnelsValeurs par défaut des paramètresFonctions variadiquesDéfinition des types de fonctionsRécapitulatif : Fonctions typées2Types fondamentaux
Types de base : num, str, boolLe type 'any' : la porte de sortieLe type 'unknown'Types Nil et optionnelsL'inférence de type en actionAnnotations explicites de typeRécapitulatif : Pratique des 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 : Peaufiner les types3Tables typées : Tableaux et Maps
Tableaux typésAjout et lecture d'élémentsQu'est-ce qu'un type Map ?Déclaration et accès aux MapsItération sur les tablesTables à formes mixtesTableaux typés multidimensionnelstable.unpack et VarargsRécapitulatif : Tableaux et MapsEntraînez-vous par vous-même : Compilateur Lua en ligne