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 = trueRegla 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.
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")
endLos 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)
endMomento 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()) -- 3Lua 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, 10Ternario 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!")