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 strictA 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"
endQuando 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.
Desafio
FácilProcesse campos do perfil do usuário que podem estar ausentes. Comece 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 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 retornaName: [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 MapsPratique por conta própria: Compilador de Lua online