Seguridad contra Nulos en Modo Estricto
Parte de la sección Introducción a Luau del Journey de Lua de Coddy — lección 71 de 73.
El fallo más común en Lua es "attempt to index nil": código que asumía que un valor existía cuando no era así. La respuesta de Luau es la disciplina con nil: bajo --!strict, un string simple nunca puede ser nil. Si nil es una posibilidad real, el tipo debe indicarlo con ?:
--!estricto
local nickname: string? = nil -- ok: string O nil
local username: string = nil -- ✗ error de tipo en modo estrictoLa disciplina funciona en ambas direcciones: dado un string?, el modo strict no te permitirá usarlo como cadena hasta que hayas descartado el nil. La herramienta estándar es una comparación simple, que reduce el tipo al igual que una protección con typeof:
local function shout(name: string?): string
if name ~= nil then
return string.upper(name) -- name es string aquí
end
return "NOBODY"
endCuando nil sea un error en lugar de un caso válido, usa assert: después de assert(x ~= nil), el comprobador trata a x como no-nil durante el resto del alcance — y en tiempo de ejecución el assert falla anticipadamente, en el punto preciso de la suposición errónea, en lugar de un lugar lejano.
La recompensa: el comprobador obliga a gestionar cada valor que "podría no existir" mientras editas, y el error en tiempo de ejecución simplemente nunca ocurre.
Desafío
FácilProcesa los campos de perfil de usuario que puedan faltar. Comienza tu archivo con --!strict.
getDisplayName(fullName: string?): string— devuelvefullNamesi no esnil, de lo contrario"Anonymous User".formatEmail(email: string?): string— devuelve el correo electrónico en minúsculas (string.lower) si no esnil, de lo contrario"No email provided".getUserInfo(name: string?, email: string?): string— usa ambas funciones y devuelve`Name: {getDisplayName(name)}, Email: {formatEmail(email)}`(en formatoName: [processed name], Email: [processed email]).
Después imprime, cada uno en su propia línea:
getDisplayName("John Smith")getDisplayName(nil)formatEmail("ALICE@EXAMPLE.COM")formatEmail(nil)getUserInfo("Bob Johnson", "bob@test.com")getUserInfo(nil, nil)getUserInfo("Sarah Wilson", nil)
Pruébalo tú mismo
--!strict
-- Escribe código aquí
-- 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 — combina ambos
-- 4) imprime las siete llamadas de prueba de la tarea
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Introducción a Luau
1Primeros pasos con Luau
¿Qué es Luau?¿Por qué usar Luau?Tu primer código en LuauComprobación de tipos y modos de errorRecapitulacion: Introducción a Luau4Trabajando con Funciones
Tipado de Parámetros y Valores de RetornoTipado de Funciones AnónimasFunciones que no Retornan NadaParámetros OpcionalesValores por Defecto en ParámetrosFunciones VariádicasDefinición de Tipos de FuncionesRecapitulaciones: Funciones Tipadas2Tipos principales
Tipos básicos: num, str, boolEl tipo 'any': Vía de escapeEl tipo 'unknown'Tipos nulos y opcionalesInferencia de tipos en acciónAnotaciones explícitas de tiposResumen: Práctica de tipos principales5Alias, Uniones e Intersecciones
Alias de tipos para primitivosTipos de uniónTrabajando con tipos de uniónTipos literalesTipos de intersecciónCombinando alias de tiposResumen: Combinaciones avanzadas de tipos8Enums al estilo de Luau
El patrón Enum en LuauEnums numéricos con tablasEnums de cadena como unionesUso de uniones literales como EnumsCongelación de tablas constantesRecapitulación: Enums al estilo de Luau11Temas Avanzados
Aseveraciones de TipoGuardias de Tipo con typeofEl Tipo neverSeguridad contra Nulos en Modo EstrictoFirmas de ÍndiceRecapitulacion: Ajuste Preciso de Tipos3Tablas tipadas: Arrays y Maps
Arrays tipadosAñadir y leer elementos¿Qué es un tipo Map?Declarar y acceder a MapsIterar tablasTablas de forma mixtaArrays tipados multidimensionalestable.unpack y VarargsRecapitulaciones: Arrays y Maps