Menu
Coddy logo textTech

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 estricto

La 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"
end

Cuando 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.

challenge icon

Desafío

Fácil

Procesa los campos de perfil de usuario que puedan faltar. Comienza tu archivo con --!strict.

  • getDisplayName(fullName: string?): string — devuelve fullName si no es nil, de lo contrario "Anonymous User".
  • formatEmail(email: string?): string — devuelve el correo electrónico en minúsculas (string.lower) si no es nil, de lo contrario "No email provided".
  • getUserInfo(name: string?, email: string?): string — usa ambas funciones y devuelve `Name: {getDisplayName(name)}, Email: {formatEmail(email)}` (en formato Name: [processed name], Email: [processed email]).

Después imprime, cada uno en su propia línea:

  1. getDisplayName("John Smith")
  2. getDisplayName(nil)
  3. formatEmail("ALICE@EXAMPLE.COM")
  4. formatEmail(nil)
  5. getUserInfo("Bob Johnson", "bob@test.com")
  6. getUserInfo(nil, nil)
  7. 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
quiz iconPonte a prueba

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