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 erro mais comum do Lua é "attempt to index nil": código que presumiu que um valor existia quando não existia. A resposta do Luau é a disciplina de nil: sob --!strict, uma string simples nunca pode ser nil. Se nil for uma possibilidade real, o tipo deve indicar isso com ?:

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

A disciplina funciona nos dois sentidos: dado um string?, o modo estrito não permitirá que você o use como uma string até que tenha descartado nil. A ferramenta padrão é uma comparação simples, que faz a restrição assim como uma verificação com typeof:

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

Quando nil seria um erro, em vez de um caso válido, use assert: depois de assert(x ~= nil), o verificador trata x como não nulo pelo restante do escopo e, em tempo de execução, o assert falha imediatamente, no ponto da suposição incorreta, em vez de em algum lugar distante.

O benefício: o verificador obriga você a tratar todo valor que "pode estar ausente" enquanto edita, e o erro de tempo de execução simplesmente nunca acontece.

challenge icon

Desafio

Fácil

Processe campos do perfil do usuário que podem estar ausentes. Comece 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 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: [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

Pratique por conta própria: Compilador de Lua online