Menu
Coddy logo textTech

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 le plus courant en Lua est "attempt to index nil" — du code qui a supposé qu'une valeur existait alors que ce n'était pas le cas. La réponse de Luau est la discipline du 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 strict

Cette discipline fonctionne dans les deux sens : face à un string?, le mode strict ne vous laissera pas l'utiliser comme une chaîne de caractères tant que vous n'aurez pas exclu nil. L'outil standard est une simple comparaison, qui restreint le type tout comme un garde typeof :

local function shout(name: string?): string
    if name ~= nil then
        return string.upper(name) -- name est une string ici
    end
    return "NOBODY"
end

Lorsque nil serait un bug plutôt qu'un cas valide, utilisez assert : après assert(x ~= nil), le vérificateur traite x comme non-nil pour le reste de la portée — et à l'exécution, l'assertion plante immédiatement, à l'endroit exact de l'hypothèse erronée, au lieu de planter plus loin.

Le bénéfice : le vérificateur vous force à gérer chaque valeur "potentiellement manquante" pendant que vous éditez, et l'erreur à l'exécution ne se produit tout simplement jamais.

challenge icon

Défi

Facile

Traitez les champs du profil utilisateur qui pourraient être manquants. Commencez votre fichier avec --!strict.

  • getDisplayName(fullName: string?): string — renvoie fullName s'il n'est pas nil, sinon Anonymous User.
  • formatEmail(email: string?): string — renvoie l'e-mail en minuscules (string.lower) s'il n'est pas nil, sinon No email provided.
  • getUserInfo(name: string?, email: string?): string — utilise les deux fonctions et renvoie Name: [processed name], Email: [processed email].

Ensuite, affichez, chacun sur sa propre ligne :

  1. getDisplayName("John Smith")
  2. getDisplayName(nil)
  3. formatEmail("ALICE@EXAMPLE.COM")
  4. formatEmail(nil)
  5. getUserInfo("Bob Johnson", "bob@test.com")
  6. getUserInfo(nil, nil)
  7. getUserInfo("Sarah Wilson", nil)

Essayez vous-même

--!strict
-- Écrivez 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 — combinez les deux
-- 4) affichez les sept appels de test de la tâche
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