Lua - Módulos
¿Qué es un módulo?
El módulo es como una biblioteca que se puede cargar usando require y tiene un solo nombre global que contiene una tabla. Este módulo puede constar de varias funciones y variables. Todas estas funciones y variables están incluidas en la tabla, que actúa como un espacio de nombres. Además, un módulo con buen comportamiento tiene las disposiciones necesarias para devolver esta tabla a require.
Especialidad de los módulos Lua
El uso de tablas en módulos nos ayuda de muchas formas y nos permite manipular los módulos de la misma forma que manipulamos cualquier otra tabla Lua. Como resultado de la capacidad de manipular módulos, proporciona funciones adicionales para las que otros lenguajes necesitan mecanismos especiales. Debido a este mecanismo gratuito de módulos en Lua, un usuario puede llamar a las funciones en Lua de múltiples formas. Algunos de ellos se muestran a continuación.
-- Assuming we have a module printFormatter
-- Also printFormatter has a funtion simpleFormat(arg)
-- Method 1
require "printFormatter"
printFormatter.simpleFormat("test")
-- Method 2
local formatter = require "printFormatter"
formatter.simpleFormat("test")
-- Method 3
require "printFormatter"
local formatterFunction = printFormatter.simpleFormat
formatterFunction("test")
En el código de muestra anterior, puede ver cuán flexible es la programación en Lua, sin ningún código adicional especial.
La función require
Lua ha proporcionado una función de alto nivel llamada require para cargar todos los módulos necesarios. Se mantiene lo más simple posible para evitar tener demasiada información en el módulo para cargarlo. La función require simplemente asume los módulos como un fragmento de código que define algunos valores, que en realidad son funciones o tablas que contienen funciones.
Ejemplo
Consideremos un ejemplo simple, donde una función tiene funciones matemáticas. Llamemos a este módulo mymath y el nombre de archivo es mymath.lua. El contenido del archivo es el siguiente:
local mymath = {}
function mymath.add(a,b)
print(a+b)
end
function mymath.sub(a,b)
print(a-b)
end
function mymath.mul(a,b)
print(a*b)
end
function mymath.div(a,b)
print(a/b)
end
return mymath
Ahora, para acceder a este módulo Lua en otro archivo, digamos, moduleutorial.lua, necesita usar el siguiente segmento de código.
mymathmodule = require("mymath")
mymathmodule.add(10,20)
mymathmodule.sub(30,20)
mymathmodule.mul(10,20)
mymathmodule.div(30,20)
Para ejecutar este código, necesitamos colocar los dos archivos Lua en el mismo directorio o, alternativamente, puede colocar el archivo del módulo en la ruta del paquete y necesita una configuración adicional. Cuando ejecutamos el programa anterior, obtendremos el siguiente resultado.
30
10
200
1.5
Cosas para recordar
Coloque tanto los módulos como el archivo que ejecuta en el mismo directorio.
El nombre del módulo y su nombre de archivo deben ser iguales.
Es una mejor práctica devolver módulos para la función requerida y, por lo tanto, el módulo debe implementarse preferiblemente como se muestra arriba, aunque puede encontrar otros tipos de implementaciones en otros lugares.
Forma antigua de implementar módulos
Permítanme ahora reescribir el mismo ejemplo de la forma anterior, que usa package.seeall tipo de implementación. Esto se usó en las versiones 5.1 y 5.0 de Lua. El módulo mymath se muestra a continuación.
module("mymath", package.seeall)
function mymath.add(a,b)
print(a+b)
end
function mymath.sub(a,b)
print(a-b)
end
function mymath.mul(a,b)
print(a*b)
end
function mymath.div(a,b)
print(a/b)
end
El uso de los módulos en moduleutorial.lua se muestra a continuación.
require("mymath")
mymath.add(10,20)
mymath.sub(30,20)
mymath.mul(10,20)
mymath.div(30,20)
Cuando ejecutamos lo anterior, obtendremos el mismo resultado. Pero se recomienda utilizar la versión anterior del código y se supone que es menos segura. Muchos SDK que usan Lua para programación como Corona SDK han desaprobado el uso de esto.