Menu
Coddy logo textTech

Segurança Nula no Modo Estrito

Parte da seção Introdução ao Luau do Journey de Lua da Coddy — lição 71 de 73.

O crash mais comum em Lua é "attempt to index nil" — código que assumiu que um valor existia quando ele não existia. A resposta do Luau é a disciplina de nil: sob --!strict, um string simples nunca pode ser nil. Se nil for uma possibilidade real, o tipo deve declarar isso com ?:

--!estrito
local nickname: string? = nil   -- ok: string OU nil
local username: string = nil    -- ✗ erro de tipo no modo estrito

A disciplina funciona nos dois sentidos: dado um string?, o modo estrito não deixará você usá-lo como uma string até que você tenha descartado o nil. A ferramenta padrão é uma comparação simples, que afunila o tipo assim como um guard de typeof:

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

Quando nil for um bug em vez de um caso válido, use assert: após assert(x ~= nil), o verificador trata x como não-nil pelo restante do escopo — e em tempo de execução o assert falha antecipadamente, no ponto da suposição quebrada, em vez de em algum lugar distante.

A vantagem: o verificador força todo valor que "pode estar ausente" a ser tratado enquanto você edita, e o erro em tempo de execução simplesmente nunca acontece.

challenge icon

Desafio

Fácil

Processe os campos de perfil de usuário que podem estar ausentes. Inicie seu arquivo com --!strict.

  • getDisplayName(fullName: string?): string — retorna fullName se não for nil, caso contrário "Anonymous User".
  • formatEmail(email: string?): string — retorna o e-mail em letras minúsculas (string.lower) se não for nil, caso contrário "No email provided".
  • getUserInfo(name: string?, email: string?): string — usa ambas as funções e retorna `Name: {getDisplayName(name)}, Email: {formatEmail(email)}` (com o formato Name: [processed name], Email: [processed email]).

Em seguida, imprima, cada um em sua própria linha:

  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)

Experimente você mesmo

--!strict
-- Escreva o código aqui
-- 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 — combine ambos
-- 4) imprima as sete chamadas de teste da tarefa
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Introdução ao Luau