Anuncios

Bienvenidos sean a este post, si se dieron cuenta de nuestros codigos anteriores es que repetimos innecesariamente, todos ellos iniciaron con el mismo patron:

local nombremod = ...
local M = {}
_G[nombremod] = M
package.loaded[nombremod] = M
	< ... configuracion para acceso externo ... >
setfenv(1, M)

A partir de Lua 5.1 disponemos de una nueva funcion llamada module que empaca esta funcionalidad de este codigo previo de configuracion, esta funcion nos da la posibilidad de iniciar un modulo de la siguiente forma:

module(...)
Anuncios

Esta llamada crea una nueva tabla, la asigna a la variable global apropiada y a la tabla loaded, para luego setear la tabla como el entorno del chunk principal, la funcion provide de forma predeterminada no provee acceso externo, por eso antes de llamarlo debes declarar las variables locales apropiadas con las funciones externas o modulos que quiere acceder, tambien puedes usar herencia para acceso externo agregando la opcion package.seeall para la llamada a module, esta opcion hace la equivalencia del siguiente codigo:

setmetatable(M, {__index = _G})

Por lo tanto agregando solamente esta declaracion:

module(..., package.seeall)

En el comienzo de un archivo lo convierte en un modulo, puedes escribir todo lo demas como codigo Lua regular, no se puede ni calificar nombres de modulos ni nombres externos, no es necesario escribir el nombre del modulo, en realidad ni siquiera necesitas conocer el nombre del modulo, no necesitas preocuparte sobre la devolucion de la tabla del modulo, y para ello lo unico que necesitas es agregar esa simple declaracion.

Anuncios

La funcion module provee algunas facilidades extras, la mayoria de los modulos no necesitan de estas facilidades pero algunas distribuciones necesitan de un tratamiento especial, por ejemplo crear un modulo que contiene tanto las funciones de C como las de Lua, antes de crear la tabla del modulo la funcion module chequea si package.loaded contiene una tabla para este modulo o si una variable con el nombre informado ya existe, si encuentra una tabla en uno de estos lugares module reusa esta tabla para el modulo, esto significa que podemos usar module para reabrir un modulo ya creado.

Si el modulo no existe todavia, module se encarga de crear la tabla del modulo y despues de eso completa la tabla con algunas de estas variables predefinidas:

  • _M, contiene la tabla del propio modulo, equivale a _G
  • _NAME, contiene el nombre del modulo, el primer argumento pasado a module
  • _PACKAGE, contiene el nombre del paquete, de esto hablamos en el proximo post.
Anuncios

En resumen, hoy hemos visto a la funcion module, para que sirve, tambien para que se utiliza, las ventajas que tiene con respecto a otras formas de iniciar nuestros modulos como hemos visto hasta ahora, espero les haya sido util sigueme en Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00