Aprende Lua en 10 minutos
Lua es un lenguaje de programación superligero, perfecto para incrustar en otras aplicaciones. ¿Sabías que se usa en juegos como ‘World of Warcraft’ y Roblox? También es popular para scripts de configuración.
1. Tu primer programa en Lua
Vamos a empezar por lo básico. Crea un archivo hello.lua
y escribe:
print("Hello, World!")
Guárdalo y ejecuta en la terminal:
lua hello.lua
Verás:
Hello, World!
¡Mira qué fácil! print()
muestra texto en pantalla.
2. Sintaxis básica
La sintaxis de Lua es super simple:
-- Esto es un comentario de una línea
print("¡Hola Mundo!")
--[[
Esto es un comentario
de múltiples líneas
]]
Puntos importantes:
- Comentarios: Una línea
--
, múltiples--[[ ]]
- Sentencias: Una por línea, sin punto y coma
- Mayúsculas: Lua distingue mayúsculas y minúsculas
- Espacios: Espacios y saltos de línea no importan
3. Variables y tipos de datos
Lua es de tipado dinámico, no declares tipos:
-- Asignación directa
nombre = "Lua"
edad = 25
increible = true
pi = 3.14159
-- Asignación múltiple
x, y, z = 10, 20, 30
-- Valor nulo es nil
vacio = nil
print("Nombre:", nombre)
print("Edad:", edad)
print("Increíble?:", increible)
Tipos de datos en Lua:
- nil: Sin valor
- boolean: true o false
- number: Números (enteros y decimales)
- string: Cadenas de texto
- table: Estructura de datos universal de Lua
- function: Funciones (ciudadanos de primera clase)
- userdata: Para C
- thread: Corrutinas
4. Manipulación de strings
-- Crear strings
str1 = "Hola"
str2 = 'Mundo'
str3 = [[Multilínea
texto fácil]]
-- Concatenar con ..
mensaje = str1 .. " " .. str2
print(mensaje) -- Salida: Hola Mundo
-- Longitud con #
longitud = #"Hola"
print(longitud) -- Salida: 4
-- Métodos de string
texto = "hello world"
mayusculas = texto:upper()
minusculas = texto:lower()
subcadena = texto:sub(1, 5)
print(mayusculas) -- Salida: HELLO WORLD
print(subcadena) -- Salida: hello
5. Tablas - El contenedor universal
Las tablas son lo mejor de Lua:
-- Como array (índices desde 1)
frutas = {"manzana", "banana", "cereza"}
print(frutas[1]) -- Salida: manzana
print(frutas[2]) -- Salida: banana
-- Como diccionario
persona = {
nombre = "Juan",
edad = 30,
ciudad = "Madrid"
}
print(persona.nombre) -- Salida: Juan
print(persona["edad"]) -- Salida: 30
-- Mixto también funciona
tablaMixta = {
"manzana",
"banana",
color = "rojo",
cantidad = 5
}
-- Operaciones con tablas
frutas = {"manzana", "banana"}
table.insert(frutas, "cereza") -- Añadir al final
table.insert(frutas, 2, "naranja") -- Insertar en posición
print(table.concat(frutas, ", ")) -- Salida: manzana, naranja, banana, cereza
6. Estructuras de control
-- If
edad = 18
if edad >= 18 then
print("Eres adulto")
elseif edad >= 13 then
print("Eres adolescente")
else
print("Eres niño")
end
-- While
contador = 1
while contador <= 5 do
print("Contador:", contador)
contador = contador + 1
end
-- For numérico
for i = 1, 5 do
print("Número:", i)
end
-- For con paso
for i = 10, 1, -2 do
print("Cuenta atrás:", i)
end
-- For para tablas
frutas = {"manzana", "banana", "cereza"}
for indice, fruta in ipairs(frutas) do
print(indice, fruta)
end
persona = {nombre = "Juan", edad = 30}
for clave, valor in pairs(persona) do
print(clave, valor)
end
7. Funciones
-- Función básica
function saludar(nombre)
return "Hola, " .. nombre .. "!"
end
mensaje = saludar("Maria")
print(mensaje) -- Salida: Hola, Maria!
-- Múltiples return
function calcular(a, b)
return a + b, a - b, a * b, a / b
end
suma, resta, producto, division = calcular(10, 5)
print("Suma:", suma) -- Salida: Suma: 15
print("Resta:", resta) -- Salida: Resta: 5
-- Función anónima (lambda)
multiplicar = function(x, y)
return x * y
end
resultado = multiplicar(4, 5)
print(resultado) -- Salida: 20
-- Funciones como parámetros
function ejecutarOperacion(x, y, operacion)
return operacion(x, y)
end
resultado = ejecutarOperacion(6, 7, multiplicar)
print(resultado) -- Salida: 42
8. Módulos
Organiza el código en módulos. Crea matematicas.lua
:
-- matematicas.lua
local Matematicas = {}
function Matematicas.sumar(a, b)
return a + b
end
function Matematicas.multiplicar(a, b)
return a * b
end
return Matematicas
Usalo en el archivo principal:
-- principal.lua
local matematicas = require("matematicas")
resultado = matematicas.sumar(10, 5)
print("Suma resultado:", resultado) -- Salida: Suma resultado: 15
resultado = matematicas.multiplicar(4, 6)
print("Multiplicación resultado:", resultado) -- Salida: Multiplicación resultado: 24
9. Manejo de errores
-- Capturar errores con pcall
function operacionPeligrosa()
error("¡Algo salió mal!")
end
-- pcall llama de forma protegida
exito, resultado = pcall(operacionPeligrosa)
if exito then
print("Éxito:", resultado)
else
print("Fallo:", resultado)
end
-- Errores personalizados
function dividir(a, b)
if b == 0 then
error("División por cero no permitida")
end
return a / b
end
exito, resultado = pcall(dividir, 10, 0)
if not exito then
print("Error:", resultado)
end
10. Ejemplos prácticos
-- Calculadora simple
function calculadora()
print("🐮 Calculadora Simple")
print("1. Sumar")
print("2. Restar")
print("3. Multiplicar")
print("4. Dividir")
opcion = tonumber(io.read())
print("Primer número:")
num1 = tonumber(io.read())
print("Segundo número:")
num2 = tonumber(io.read())
if opcion == 1 then
resultado = num1 + num2
print("Resultado:", resultado)
elseif opcion == 2 then
resultado = num1 - num2
print("Resultado:", resultado)
elseif opcion == 3 then
resultado = num1 * num2
print("Resultado:", resultado)
elseif opcion == 4 then
if num2 ~= 0 then
resultado = num1 / num2
print("Resultado:", resultado)
else
print("❌ División por cero")
end
else
print("🤔 Opción inválida")
end
end
-- Para usar, quita el comentario
-- calculadora()
-- Operaciones de archivo
function leerArchivo(nombreArchivo)
local archivo = io.open(nombreArchivo, "r")
if not archivo then
return nil, "No se puede abrir el archivo"
end
local contenido = archivo:read("*a")
archivo:close()
return contenido
end
contenido, error = leerArchivo("ejemplo.txt")
if contenido then
print("Contenido:", contenido)
else
print("Error:", error)
end
Conclusión
¡Lua es genial! Perfecto para:
- 🎮 Scripting de juegos (muchos juegos lo usan)
- 🔧 Desarrollo embebido (por su ligereza)
- ⚙️ Archivos de configuración y automatización
- 🚀 Escenarios de alto rendimiento (con LuaJIT)
Lo mejor de Lua:
- Superligero: Ocupa poco espacio
- Rápido: LuaJIT es ultra rápido
- Flexible: Tipado dinámico + tablas universales
- Portable: Funciona en móviles y servidores
- Fácil de incrustar: Se lleva bien con C/C++
¿Quieres aprender más? Prueba:
- Librería estándar de Lua
- Corrutinas (programación concurrente)
- Metatables y metamethdos (para OOP)
- API de C de Lua
- Love2D para desarrollo de juegos
¡Lua es fácil de aprender y muy potente! 🚀