En este módulo, aprenderemos sobre los módulos y paquetes en Lua, que son fundamentales para organizar y reutilizar el código de manera eficiente. Los módulos permiten dividir el código en partes más manejables y reutilizables, mientras que los paquetes facilitan la distribución y el uso de bibliotecas de terceros.

  1. ¿Qué es un Módulo?

Un módulo en Lua es simplemente un archivo que contiene código Lua y que puede ser cargado y utilizado en otros scripts. Los módulos permiten encapsular funcionalidades específicas y reutilizarlas en diferentes partes de un programa.

1.1. Creación de un Módulo

Para crear un módulo, simplemente escribimos el código en un archivo y lo retornamos como una tabla. Aquí hay un ejemplo de un módulo simple que proporciona funciones matemáticas básicas:

-- math_module.lua
local math_module = {}

function math_module.add(a, b)
    return a + b
end

function math_module.subtract(a, b)
    return a - b
end

return math_module

1.2. Uso de un Módulo

Para usar un módulo en otro script, utilizamos la función require. Aquí hay un ejemplo de cómo usar el módulo math_module que creamos anteriormente:

-- main.lua
local math_module = require("math_module")

local sum = math_module.add(5, 3)
local difference = math_module.subtract(5, 3)

print("Sum: " .. sum)           -- Output: Sum: 8
print("Difference: " .. difference) -- Output: Difference: 2

  1. Paquetes

Un paquete en Lua es una colección de módulos que se agrupan y distribuyen juntos. Los paquetes facilitan la distribución de bibliotecas de terceros y la gestión de dependencias.

2.1. Estructura de un Paquete

Un paquete generalmente tiene una estructura de directorios que organiza los módulos de manera lógica. Aquí hay un ejemplo de la estructura de un paquete:

my_package/
├── init.lua
├── module1.lua
└── module2.lua
  • init.lua: Este archivo se ejecuta cuando se carga el paquete y puede inicializar el paquete o cargar otros módulos.
  • module1.lua y module2.lua: Estos son módulos individuales que forman parte del paquete.

2.2. Creación de un Paquete

Vamos a crear un paquete llamado my_package con dos módulos: module1 y module2.

-- my_package/init.lua
local my_package = {}

my_package.module1 = require("my_package.module1")
my_package.module2 = require("my_package.module2")

return my_package
-- my_package/module1.lua
local module1 = {}

function module1.greet()
    return "Hello from Module 1"
end

return module1
-- my_package/module2.lua
local module2 = {}

function module2.greet()
    return "Hello from Module 2"
end

return module2

2.3. Uso de un Paquete

Para usar el paquete my_package, simplemente lo requerimos en nuestro script principal:

-- main.lua
local my_package = require("my_package")

print(my_package.module1.greet()) -- Output: Hello from Module 1
print(my_package.module2.greet()) -- Output: Hello from Module 2

  1. Ejercicios Prácticos

Ejercicio 1: Crear un Módulo de Utilidades

  1. Crea un módulo llamado utils.lua que contenga las siguientes funciones:

    • is_even(n): Devuelve true si n es par, de lo contrario false.
    • factorial(n): Devuelve el factorial de n.
  2. Usa el módulo utils en un script principal para verificar si un número es par y calcular el factorial de un número.

Solución:

-- utils.lua
local utils = {}

function utils.is_even(n)
    return n % 2 == 0
end

function utils.factorial(n)
    if n == 0 then
        return 1
    else
        return n * utils.factorial(n - 1)
    end
end

return utils
-- main.lua
local utils = require("utils")

local number = 5
print("Is " .. number .. " even? " .. tostring(utils.is_even(number))) -- Output: Is 5 even? false
print("Factorial of " .. number .. " is " .. utils.factorial(number)) -- Output: Factorial of 5 is 120

Ejercicio 2: Crear un Paquete de Matemáticas

  1. Crea un paquete llamado math_package con dos módulos:

    • basic.lua: Contiene funciones para suma y resta.
    • advanced.lua: Contiene funciones para multiplicación y división.
  2. Usa el paquete math_package en un script principal para realizar operaciones matemáticas básicas y avanzadas.

Solución:

-- math_package/init.lua
local math_package = {}

math_package.basic = require("math_package.basic")
math_package.advanced = require("math_package.advanced")

return math_package
-- math_package/basic.lua
local basic = {}

function basic.add(a, b)
    return a + b
end

function basic.subtract(a, b)
    return a - b
end

return basic
-- math_package/advanced.lua
local advanced = {}

function advanced.multiply(a, b)
    return a * b
end

function advanced.divide(a, b)
    if b == 0 then
        error("Division by zero")
    end
    return a / b
end

return advanced
-- main.lua
local math_package = require("math_package")

print("Addition: " .. math_package.basic.add(5, 3))       -- Output: Addition: 8
print("Subtraction: " .. math_package.basic.subtract(5, 3)) -- Output: Subtraction: 2
print("Multiplication: " .. math_package.advanced.multiply(5, 3)) -- Output: Multiplication: 15
print("Division: " .. math_package.advanced.divide(5, 3))   -- Output: Division: 1.6666666666667

Conclusión

En esta sección, hemos aprendido cómo crear y usar módulos y paquetes en Lua. Los módulos nos permiten organizar y reutilizar el código de manera eficiente, mientras que los paquetes facilitan la distribución y el uso de bibliotecas de terceros. Con estos conocimientos, estarás mejor preparado para estructurar tus proyectos Lua de manera más modular y mantenible. En el próximo módulo, exploraremos el manejo de errores en Lua.

© Copyright 2024. Todos los derechos reservados