Seguridad frente a nil en modo estricto
Parte de la sección Introducción a Luau del Journey de Lua de Coddy. Lección 77 de 80.
El error más común de Lua es "attempt to index nil": código que suponía que un valor existía cuando no era así. La respuesta de Luau es la disciplina de nil: con --!strict, una string simple nunca puede ser nil. Si nil es una posibilidad real, el tipo debe indicarlo con ?:
--!estricto
local nickname: string? = nil -- válido: string O nil
local username: string = nil -- ✗ error de tipo en modo estrictoLa disciplina funciona en ambos sentidos: si tienes una string?, el modo estricto no te dejará usarla como cadena hasta que hayas descartado nil. La herramienta habitual es una comparación simple, que acota el tipo igual que una comprobación con typeof:
local function shout(name: string?): string
if name ~= nil then
return string.upper(name) -- name es de tipo string aquí
end
return "NOBODY"
endCuando nil sería un error en lugar de un caso válido, usa assert: después de assert(x ~= nil), el verificador trata x como distinto de nil durante el resto del ámbito y, en tiempo de ejecución, la aserción provoca un error de inmediato, justo donde se incumple la suposición, en lugar de hacerlo en algún lugar muy alejado.
La ventaja: el verificador te obliga a gestionar cada valor que «podría faltar» mientras editas, y el error de ejecución simplemente no ocurre nunca.
Desafío
FácilEscribe un nombre que podría no tener un valor alternativo seguro.
- Mantén
--!stricten la primera línea. - Escribe
local function getDisplayName(fullName: string?): stringque devuelvafullNamecuando no seanil; de lo contrario,"Anonymous User". - Imprime
getDisplayName("John Smith")ygetDisplayName(nil).
Pulsa Ejecutar código: la salida muestra John Smith y Anonymous User.
Pruébalo tú mismo
--!estricto
-- 1) getDisplayName(fullName: string?): string, usando "Anonymous User" como valor predeterminado
-- 2) imprímelo para "John Smith" y nil
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 Luau4Trabajar con funciones
Tipado de parámetros y valores de retornoTipado de funciones anónimasFunciones que no devuelven nadaParámetros opcionalesValores predeterminados de parámetrosValores predeterminados para booleanosFunciones variádicasDefinir tipos de funcionesRepaso: funciones tipadas7Proyecto: Gestor de tareas tipado
Proyecto: La estructura de una tareaFunción para añadir una tarea2Tipos fundamentales
Número, cadena y booleanoEl tipo 'any': una salida de emergenciaEl tipo 'unknown'Tipos nulos y opcionalesLa inferencia de tipos en acciónAnotaciones de tipo explícitasRepaso: práctica de tipos fundamentales5Alias, 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
Aserciones de tipoProtectores de tipo con typeofEl tipo neverSeguridad frente a nil en modo estrictoFirmas de índiceRepaso: tipos de valores de configuraciónRepaso: ajuste fino de tipos3Tablas tipadas: arrays y mapas
Arrays tipadosAgregar y leer elementos¿Qué es un tipo mapa?Declarar y acceder a mapasRecorrer tablasTablas de formas mixtasLeer una cuadrículaConstruir una cuadrículatable.unpackRepaso: arrays y mapasPractica por tu cuenta: Compilador de Luau online