Hoja de Trucos de Lua
Última actualización
Hola Mundo y ejecutar código
Lua es minimalista: una sola sentencia se ejecuta.
| Operación | Sintaxis |
|---|---|
| Imprimir una línea | print("Hello, World!") |
| Imprimir varios valores | print("x", 1, true) |
| Escribir sin salto de línea | io.write("Hi") |
| Comentario | -- this is a comment |
| Comentario de varias líneas | --[[ ... ]] |
| Concatenar cadenas | print("Hi " .. name) |
| Ejecutar un archivo | lua app.lua |
| Shell interactiva | lua |
Variables y tipos
Las variables son globales por defecto; declara las locales con local.
| Operación | Sintaxis |
|---|---|
| Variable local | local age = 30 |
| Variable global | count = 0 |
| Asignación múltiple | local a, b = 1, 2 |
| Los ocho tipos | nil, boolean, number, string, table, function, userdata, thread |
| Nil / booleanos | nil, true, false |
| Comprobar el tipo | type(x) devuelve "number" |
| Convertir a número | tonumber("42") |
| Convertir a cadena | tostring(42) |
Cadenas
Las cadenas son inmutables; funcionan tanto las comillas simples como las dobles.
| Operación | Sintaxis |
|---|---|
| Longitud | #s o string.len(s) |
| Concatenar | s1 .. s2 |
| Mayúsculas / minúsculas | s:upper(), s:lower() |
| Subcadena | s:sub(1, 3) |
| Buscar una subcadena | s:find("ell") |
| Reemplazar (gsub) | s:gsub("a", "b") |
| Formato | string.format("%05d", 42) |
| Cadena larga | [[ multi\nline ]] |
Tablas (la estructura de datos central)
Las tablas son el único tipo estructurado de Lua: funcionan como arrays, mapas y objetos.
| Operación | Sintaxis |
|---|---|
| Tabla vacía | local t = {} |
| Estilo array (base 1) | local t = {10, 20, 30} |
| Acceder a un elemento del array | t[1] (primer elemento) |
| Tabla estilo mapa | local u = {name = "Ada", age = 30} |
| Acceder a un valor del mapa | u.name o u["name"] |
| Establecer un valor | t[4] = 40, u.email = "a@x.com" |
| Longitud de la parte de array | #t |
| Iterar el array (ipairs) | for i, v in ipairs(t) do ... end |
| Iterar todas las claves (pairs) | for k, v in pairs(u) do ... end |
| Tabla anidada | local m = {a = {1, 2}} |
Control de flujo
Los bloques se cierran con end; solo nil y false son falsy.
| Operación | Sintaxis |
|---|---|
| If / elseif / else | if x > 0 then ... elseif x < 0 then ... else ... end |
| Operadores lógicos | and, or, not |
| For numérico | for i = 1, 10 do ... end |
| For con paso | for i = 10, 1, -1 do ... end |
| Bucle while | while x < 100 do ... end |
| Repeat-until | repeat ... until done |
| Break | break |
| Operador de desigualdad | if a ~= b then ... end |
Funciones
Las funciones son valores de primera clase y pueden devolver varios resultados.
| Operación | Sintaxis |
|---|---|
| Definir una función | function add(a, b) return a + b end |
| Función local | local function square(x) return x * x end |
| Función anónima | local f = function(x) return x * 2 end |
| Varios valores de retorno | function bounds() return 1, 10 end |
| Capturar varios retornos | local lo, hi = bounds() |
| Función variádica | function sum(...) ... end |
| Recolectar varargs | local args = {...} |
| Método (sintaxis de dos puntos) | function obj:greet() ... end |
Biblioteca string
Funciones comunes de la biblioteca string (invocables como s:fn()).
| Función | Qué hace |
|---|---|
string.len(s) | Longitud de la cadena |
string.sub(s, i, j) | Subcadena del índice i al j |
string.upper(s) | Copia en mayúsculas |
string.rep(s, n) | Repite la cadena n veces |
string.find(s, p) | Busca un patrón, devuelve inicio/fin |
string.match(s, p) | Devuelve la primera coincidencia del patrón |
string.gsub(s, p, r) | Reemplaza todas las coincidencias del patrón |
string.format(fmt, ...) | Da formato a valores en una cadena |
Bibliotecas table y math
Ayudantes para trabajar con tablas de estilo array y con números.
| Función | Qué hace |
|---|---|
table.insert(t, v) | Añade un valor al final |
table.insert(t, i, v) | Inserta v en la posición i |
table.remove(t, i) | Elimina y devuelve el elemento en i |
table.concat(t, ", ") | Une los elementos en una cadena |
table.sort(t) | Ordena el array en el sitio |
math.floor(x) / math.ceil(x) | Redondea hacia abajo / arriba |
math.max(...) / math.min(...) | Argumento mayor / menor |
math.random(1, 6) | Entero aleatorio dentro de un rango |
Metatablas (breve)
Las metatablas te permiten personalizar cómo se comportan las tablas: operadores, indexación y más.
| Operación | Sintaxis |
|---|---|
| Establecer una metatabla | setmetatable(t, mt) |
| Obtener una metatabla | getmetatable(t) |
| Respaldo para claves faltantes | mt.__index = defaults |
| Valor por defecto vía función | mt.__index = function(t, k) ... end |
| Personalizar la suma | mt.__add = function(a, b) ... end |
| Personalizar tostring | mt.__tostring = function(t) ... end |
| POO basada en prototipos | mt.__index = ClassTable |
La sintaxis de Lua que más usas, en una sola página. Esta hoja de trucos de Lua es una referencia rápida para el núcleo del lenguaje: variables y tipos, cadenas, control de flujo, funciones y las tablas que sirven como la única y flexible estructura de datos de Lua, además de un vistazo a las bibliotecas estándar y las metatablas.
Todo lo que hay aquí es Lua estándar y se ejecuta en un intérprete sin modificar. Copia lo que necesites o prueba cada fragmento en vivo en el playground de Lua, sin necesidad de instalar nada.
Preguntas frecuentes sobre la hoja de trucos de Lua
¿Esta hoja de trucos de Lua es gratis?
¿Cómo puede una tabla de Lua ser a la vez un array y un mapa?
{10, 20, 30}) la tabla se comporta como un array; cuando usas claves de cadena ({name = "Ada"}) se comporta como un mapa. Incluso puedes mezclar ambos en la misma tabla. Por eso Lua solo necesita un tipo estructurado: la tabla cubre arrays, diccionarios, conjuntos y objetos.¿Por qué Lua usa indexación basada en 1?
t[1] es el primer elemento y #t es el conteo. El operador de longitud # y las funciones de biblioteca como table.insert e ipairs asumen todas esta convención basada en 1, así que respetarla mantiene tu código de arrays funcionando como se espera.