{}const=>[]async()letfn</>var
LuaDesarrollo

Lua sin dolor: desglosamos los conceptos básicos del lenguaje en ejemplos simples que son realmente comprensibles

Entendiendo Lua desde cero: variables, tablas, funciones, programación orientada a objetos a través de metatablas. Todo con ejemplos de código en vivo, sin aburrimiento académico. Aprenderás por qué Lua vive en Roblox, Neovim, Redis y NGINX, y cómo empezar a escribir en él hoy mismo.

К

Kodik

Autor

7 min de lectura

Has jugado a Roblox, World of Warcraft, Garry's Mod o has estado jugando con nginx, y ni siquiera sospechabas que todo este tiempo has estado usando Lua. Es hora de conocernos como es debido.

Lua es el mismo lenguaje del que todo el mundo dice «ah, esto es para juegos», y luego resulta que vive en Redis, NGINX (OpenResty), Wireshark, Neovim y en un montón de lugares donde se necesita un motor de script rápido y fácil de integrar.

Todo el intérprete Lua pesa menos de 300 KB. Al mismo tiempo, Lua se incluye constantemente en el top de los lenguajes de script más rápidos (LuaJIT generalmente vuela al nivel de C en algunos benchmarks).

Variables: todo es simple, pero hay un matiz

Variables predeterminadas en Lua globales. Sí, al igual que en JavaScript hasta "use strict". Y sí, es una trampa.

-- Это глобальная переменная. Она видна ОТОВСЮДУ.
name = "Code"

-- А вот так — локальная. Используй local ВСЕГДА.
local age = 25
local is_cool = true

Regla número uno: escribe siempre local. Si lo olvidas, la variable se filtra al ámbito global, y luego pasarás dos horas depurando por qué counter se restablece en lugares aleatorios.

🔥 100.000+ estudiantes ya están con nosotros

¿Cansado de leer teoría?
¡Hora de programar!

Kodik — una app donde aprendes a programar con práctica. Mentor IA, lecciones interactivas, proyectos reales.

🤖 IA 24/7
🎓 Certificados
💰 Gratis
🚀 Empezar
Se unieron hoy

Tipos de datos: minimalismo en todo su esplendor

En Lua en total 8 tipos. Ocho. Para que lo compares, en TypeScript tienes más tipos que amigos en LinkedIn.

local a = 42            -- number (и int, и float — всё number)
local b = "hello"       -- string
local c = true          -- boolean
local d = nil           -- nil (отсутствие значения)
local e = {}            -- table (массив, объект, словарь — всё в одном)
local f = print         -- function (да, функции — это значения)

Lo más importante: table es la única estructura de datos. ¿Matriz? Tabla. ¿Objeto? Tabla. ¿Diccionario? También tabla. ¿HashMap? Adivina.

Tablas: un tipo para gobernarlas a todas

Table en Lua es una navaja suiza. Mira:

-- Как массив (индексация с 1, а не с 0!)
local fruits = {"apple", "banana", "mango"}
print(fruits[1])  -- "apple"  (не fruits[0]!)

-- Как словарь
local user = {
    name = "Alexey",
    level = "senior",
    stack = {"Vue", "Nuxt", "Lua"}
}
print(user.name)       -- "Alexey"
print(user["level"])   -- "senior"

-- Как и то, и другое одновременно (но лучше так не делай)
local chaos = {
    "first",
    name = "Chaos",
    "second",
    power = 9000
}

Indexación desde uno — esto es lo que hace que los desarrolladores de C, Python y JS caminen con cara de piedra durante los primeros 30 minutos. Pero luego te acostumbras. Te lo prometo.

Condiciones y ciclos: un clásico del género

Sin llaves. Sin elif. Simplemente if, elseif, then y end:

local hp = 75

if hp <= 0 then
    print("Game Over")
elseif hp < 30 then
    print("Critically low HP!")
else
    print("Everything is fine, we live")
end

Los ciclos tampoco tienen sorpresas:

-- Числовой for
for i = 1, 5 do
    print("Iteration:", i)
end

-- While
local count = 0
while count < 3 do
    print(count)
    count = count + 1  -- Да, в Lua нет ++ и +=
end

-- Перебор таблицы
local heroes = {"Geralt", "Link", "Mario"}
for index, hero in ipairs(heroes) do
    print(index .. ". " .. hero)
end

Momento de dolor: no hay en Lua +=, -=, ++. Cada vez que escribes count = count + 1 como en 2003. Hay una propuesta para añadir operadores compuestos, pero por ahora, resígnate.

Funciones: ciudadanos de primera clase

Las funciones en Lua son valores completos. Se pueden almacenar en variables, pasar como argumentos, devolver desde otras funciones:

-- Обычная функция
local function greet(name)
    return "Hi, " .. name .. "!"
end

print(greet("World"))  -- "Hello, World!"

-- Функция, которая возвращает функцию (замыкание!)
local function create_counter()
    local count = 0
    return function()
        count = count + 1
        return count
    end
end

local counter = create_counter()
print(counter())  -- 1
print(counter())  -- 2
print(counter())  -- 3

Lua es compatible con múltiples valores devueltos - sin ningún envoltorio en matrices u objetos:

local function get_user()
    return "Alexey", 25, "frontend"
end

local name, age, role = get_user()
print(name)  -- "Alexey"
print(role)  -- "frontend"

Líneas: concatenación a través de ..

Olvídate de + para las cadenas. En Lua, la concatenación es ..:

local first = "Hello"
local second = "World"
print(first .. " " .. second)  -- "Hello World"

-- Длина строки
print(# "Kodik")  -- 10 (¡bytes UTF-8, no caracteres!)
-- string.format — как printf, только в Lua
local msg = string.format("%s %d HP", "hero", 100)
print(msg)  -- "The hero has 100 HP"

Importante: el operador # devuelve la longitud en bytes, no en caracteres. Para el cirílico, esto es una trampa: cada letra ocupa 2 bytes en UTF-8.

OOP: recopilación de tablas y metatablas

Lua no tiene clases listas para usar. Pero hay metatablas - un mecanismo a través del cual se puede implementar la herencia, la sobrecarga de operadores y, en general, cualquier modelo de objeto:

-- "Class" через таблицу
local Player = {}
Player.__index = Player

function Player.new(name, hp)
    local self = setmetatable({}, Player)
    self.name = name
    self.hp = hp
    return self
end

function Player:take_damage(amount)
    self.hp = self.hp - amount
    if self.hp <= 0 then
        print(self.name .. " defeated!")
    else
        print(self.name .. ": remaining " .. self.hp .. " HP")
    end
end

-- Использование
local hero = Player.new("Geralt", 100)
hero:take_damage(30)   -- "Geralt: 70 HP left"
hero:take_damage(80)   -- "Geralt is defeated!"

Presta atención a dos puntos (:) es azúcar sintáctico. hero:take_damage(30) es equivalente a hero.take_damage(hero, 30). Los dos puntos transmiten automáticamente self.

Fichas que sorprenden

Asignación múltiple:

local a, b = 10, 20
a, b = b, a  -- swap без временной переменной!
print(a, b)  -- 20, 10

Ternario a través de and/or:

-- В Lua нет ternary operator, но есть хак:
local status = (hp > 0) and "alive" or "dead"

Varargs - número variable de argumentos:

local function sum(...)
    local total = 0
    for _, v in ipairs({...}) do
        total = total + v
    end
    return total
end

print(sum(1, 2, 3, 4, 5))  -- 15

¿Dónde se utiliza Lua en este momento?

Lua no es una pieza de museo. Funciona en la producción de miles de millones de usuarios:

  • Roblox — todo el script del juego en Luau (fork Lua)

  • Neovim — las configuraciones y los complementos se escriben en Lua, no en VimScript

  • Redis - scripts para operaciones atómicas

  • NGINX/OpenResty — puertas de enlace API de alta carga

  • World of Warcraft — complementos que escriben millones de jugadores

  • Sistemas integrados — Dispositivos IoT donde cada kilobyte cuenta

Si quieres consolidar, practica

La teoría sin práctica se olvida en una semana, es un hecho. Si realmente quieres entender la programación, y no solo leer un artículo y cerrar la pestaña, inténtalo Kodik.

Kodik es una aplicación para aprender programación con un enfoque práctico. Aquí no solo lees la teoría, sino que resuelves problemas, escribes código y ves el resultado de inmediato. Los cursos de Python, JavaScript, HTML, CSS y otras tecnologías están diseñados para que puedas aprender a tu propio ritmo, desde tu teléfono u ordenador.

Y también tenemos Comunidad de Telegram con más de 2000 desarrolladores, donde se publican regularmente publicaciones útiles sobre programación. Esta es una excelente manera de repetir el material en un formato conveniente: hojeas la cinta y al mismo tiempo bombeas conocimiento. Suscríbete y aprende con nosotros.

Total

Lua es un lenguaje que demuestra que no es necesario ser complejo para ser potente. 8 tipos de datos, una estructura de datos, una sintaxis minimalista, y al mismo tiempo funciona en game dev, servidores web, bases de datos y sistemas integrados.

Si alguna vez has soñado con escribir un mod para tu juego favorito, hacer un plugin para Neovim o simplemente quieres aprender un idioma en un fin de semana, Lua es una excelente opción. La barrera de entrada es mínima y las posibilidades son bastante serias.

print("Good luck learning Lua!")

🎯Deja de postergar

¿Te gustó el artículo?
¡Hora de practicar!

En Kodik no solo lees — escribes código de inmediato. Teoría + práctica = habilidades reales.

Práctica instantánea
🧠IA explica código
🏆Certificado

Sin registro • Sin tarjeta