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 estritoA 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"
endQuando 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.
Desafio
FácilProcesse os campos de perfil de usuário que podem estar ausentes. Inicie seu arquivo com --!strict.
getDisplayName(fullName: string?): string— retornafullNamese não fornil, caso contrário"Anonymous User".formatEmail(email: string?): string— retorna o e-mail em letras minúsculas (string.lower) se não fornil, 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 formatoName: [processed name], Email: [processed email]).
Em seguida, imprima, cada um em sua própria linha:
getDisplayName("John Smith")getDisplayName(nil)formatEmail("ALICE@EXAMPLE.COM")formatEmail(nil)getUserInfo("Bob Johnson", "bob@test.com")getUserInfo(nil, nil)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
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
1Começando com o Luau
O que é Luau?Por que usar Luau?Seu primeiro código em LuauVerificação de tipos e modos de erroRecapitulando: Introdução ao Luau4Trabalhando com Funções
Tipando Parâmetros e Valores de RetornoTipando Funções AnônimasFunções que Não Retornam NadaParâmetros OpcionaisValores Padrão para ParâmetrosFunções VariádicasDefinindo Tipos de FunçõesRecapitulação: Funções Tipadas2Tipos Fundamentais
Tipos Básicos: num, str, boolO Tipo 'any': Escape HatchO Tipo 'unknown'Tipos Nil e OpcionaisInferência de Tipos na PráticaAnotações Explícitas de TiposReciclagem: Prática de Tipos Fundamentais5Aliases, Uniões, Interseções
Aliases de Tipos para PrimitivosTipos de UniãoTrabalhando com Tipos de UniãoTipos LiteraisTipos de InterseçãoCombinando Aliases de TiposRecapitulando: Combinações Avançadas de Tipos8Enums, do Jeito Luau
O Padrão Enum no LuauEnums Numéricos com TablesEnums de String como UnionsUsando Enums de Union LiteralCongelando Tables ConstantesRecapitulação: Enums, do Jeito Luau11Tópicos Avançados
Asserções de TipoType Guards com typeofO Tipo neverSegurança Nula no Modo EstritoAssinaturas de ÍndiceRecapitulação: Ajuste Fino de Tipos3Tabelas Tipadas: Arrays e Maps
Arrays TipadosAdicionando e Lendo ElementosO que é um Tipo Map?Declarando e Acessando MapsIterando Sobre TabelasTabelas de Formato MistoArrays Tipados Multidimensionaistable.unpack e VarargsRecapitulando: Arrays e Maps