Segurança contra nil no Modo Estrito
Parte da seção Introdução ao Luau do Journey de Lua da Coddy. Lição 77 de 80.
A falha mais comum em Lua é "tentativa de indexar nil": código que presumiu que um valor existia quando não existia. A resposta do Luau é a disciplina de nil: com --!strict, um string simples nunca pode ser nil. Se nil for uma possibilidade real, o tipo precisa 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: quando você tem um string?, o modo estrito não permite usá-lo como uma string até que você confirme que não é nil. A ferramenta padrão é uma comparação simples, que restringe o tipo assim como uma verificação com typeof:
local function shout(name: string?): string
if name ~= nil then
return string.upper(name) -- name é uma string aqui
end
return "NOBODY"
endQuando nil seria um bug, e não um caso válido, use assert: depois de assert(x ~= nil), o verificador trata x como diferente de nil pelo restante do escopo, e, em tempo de execução, o assert falha imediatamente, no ponto em que a suposição está errada, em vez de falhar em algum lugar distante.
A vantagem: o verificador obriga você a lidar com cada valor que "pode estar ausente" enquanto edita, e o erro em tempo de execução simplesmente nunca acontece.
Desafio
FácilForneça um nome que pode estar ausente e um valor alternativo seguro.
- Mantenha
--!strictna primeira linha. - Escreva
local function getDisplayName(fullName: string?): string, retornandofullNamequando não fornil; caso contrário, retorne"Anonymous User". - Imprima
getDisplayName("John Smith")egetDisplayName(nil).
Pressione Executar código: a saída mostra John Smith e Anonymous User.
Experimente você mesmo
--!strict
-- 1) getDisplayName(fullName: string?): string, usando "Anonymous User" como valor padrão
-- 2) imprima o resultado para "John Smith" e nil
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
Tipagem de parâmetros e valores de retornoTipagem de funções anônimasFunções sem retornoParâmetros opcionaisValores padrão dos parâmetrosValores padrão para booleanosFunções variádicasDefinindo tipos de funçãoRecapitulação: funções tipadas2Tipos básicos
Número, string e booleanoO tipo 'any': válvula de escapeO tipo 'unknown'Tipos nulos e opcionaisInferência de tipos na práticaAnotações explícitas de tipoRevisão: prática com tipos básicos5Aliases, 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 TipoProteções de Tipo com typeofO Tipo neverSegurança contra nil no Modo EstritoAssinaturas de ÍndiceRevisão: Tipos de Valores de ConfiguraçãoRevisão: Ajuste Fino de Tipos3Tabelas Tipadas: Arrays e Maps
Arrays TipadosAdicionando e Lendo ElementosO que é um Tipo Map?Declarando e Acessando MapsPercorrendo TabelasTabelas com Formatos MistosLendo uma GradeConstruindo uma Gradetable.unpackRevisão: Arrays e MapsPratique por conta própria: Compilador de Luau online