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 error más común de Lua es «attempt to index nil»: código que suponía que existía un valor cuando no era así. La respuesta de Luau es la disciplina con nil: con --!strict, un string simple nunca puede ser nil. Si nil es una posibilidad real, el tipo debe indicarlo con ?:

--!strict
local nickname: string? = nil   -- ok: string O nil
local username: string = nil    -- ✗ error de tipo en modo strict

La disciplina funciona en ambos sentidos: dado un string?, el modo estricto no te permitirá usarlo como una cadena hasta que hayas descartado nil. La herramienta estándar es una comparación simple, que hace una reducción del tipo igual que una comprobació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 sería un error en lugar de un caso válido, usa assert: después de assert(x ~= nil), el comprobador trata x como no nulo durante el resto del ámbito, y en tiempo de ejecución la aserción falla de inmediato, en el punto donde se produce la suposición incorrecta, en lugar de hacerlo en algún lugar muy distante.

La ventaja: el comprobador te obliga a gestionar cada valor que «podría faltar» mientras editas, y el error en tiempo de ejecución simplemente nunca ocurre.

challenge icon

Desafío

Fácil

Procesa los campos del perfil de usuario que podrían faltar. Comienza el archivo con --!strict.

  • getDisplayName(fullName: string?): string: devuelve fullName si no es nil; de lo contrario, devuelve Anonymous User.
  • formatEmail(email: string?): string: devuelve el correo electrónico en minúsculas (string.lower) si no es nil; de lo contrario, devuelve No email provided.
  • getUserInfo(name: string?, email: string?): string: utiliza ambas funciones y devuelve 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

Practica por tu cuenta: Compilador de Lua online