Un modulo en teoría podríamos decir que es una variable que toma el contenido de un archivo,los módulos nos hacen fácil el trabajo a la hora de programar programas largos,ya que podemos dividirlos en subprogramas o módulos y resolver los problemas de forma mas sencilla.
Un modulo en lua es como un objeto,no tanto como en Perl que se usa para crear clases pero se parece a lo que seria una clase,también se parece mucho a la forma que usa módulos Python,asi que si ya lo conocen verán el parecido,es como una mezcla de referencias Perl y módulos Python.
Primero que nada vamos a usar módulos que están definidos por el sistema y luego crearemos nosotros mismos algunos.
Primero que nada los módulos los llamamos con la palabra especial require,como en otros lenguajes,los módulos del sistema en algunos casos no es necesario llamarlos,pero como he dicho antes es bueno para saber que usamos.
El modulo os:
Para llamarlo:
require 'os'
Los módulos pueden ser escritos en C o en Lua,tienen terminación .lua o .so,se guardan en el PATH de Lua por defecto,o en el caso de los que creamos en el mismo directorio.
No necesitamos usar la extensión a la hora de llamarlos.
El Path lo podemos consultar en el modulo package,de la siguiente manera desde la terminal:
lua -e 'print(package.path)'
Y los módulos de C:
lua -e 'print(package.cpath)'
Continuamos con el módulos os:
Como ya hemos llamado os,podemos usar sus funciones:
Por ejemplo podemos llamar variables de entorno con la función getenv:
Por ejemplo en la shell de bash podemos saber el usuario actual asi:
echo $USER
O el PATH de los programas del sistema así:
echo $PATH
En lua:
print(os.getenv("USER"))
print(os.getenv("PATH"))
Podemos borrar un archivo así:
os.remove("archivo")
Podemos renombrar un archivo así:
os.rename("viejo_nombre", "nuevo_nombre")
Podemos ejecutar un comando del sistema asi:
os.execute('date')
Para cerrar el programa:
os.exit(1)
Existen muchas librerías,pero ese es un ejemplo de como se pueden usar,otra cosa que se debe aclarar es que se puede cambiar el nombre del modulo como en python:
sistema = require 'os'
print(sistema.getenv("PATH"))
Bien ahora vamos a crear nuestro modulos:
Primero que nada el modulo lo guardamos en la carpeta donde estamos,si queremos crear una tipo biblioteca,ascendente al path actual podemos usar la notación de punto,por ejemplo:
Tenemos el sistema así:
A la hora de llamarlo usaríamos:
requite 'lib.modulo'
Bien vamos a crear un modulo,por ejemplo itimetux.lua:
vim itimetux.lua
Lo primero que vamos a hacer es que todo lo que usemos va a ser local,para amarrarlo dentro del modulo creamos una tabla local:
local itimetux = {}
Ahora podemos crear una función:
function itimetux.info()
print("Version 1.0")
end
function itimetux.saluda(x)
print("Hola "..x.." soy itimetux")
end
Luego tenemos que regresar el modulo,como esta todo amarrado basta con retornar la tabla:
return itimetux
Ahora en el programa principal,vamos a llamarlo pasandole el valor a una variable:
#!/usr/bin/env lua
itime = require 'lib.itimetux' -- Pasamos valor a una variable
itime.info()
itime.saluda("Atheyus")
Podemos usar funciones privadas haciéndolas locales y no metiendolas en la tabla que es el modulo,de esta manera podremos usar funciones privadas para nuestro modulo,por ejemplo:
local itimetux = {}
local function dominio() -- funcion privada
return "http://www.itimetux.com"
end
function itimetux.info()
print("Dominio : "..dominio())
print("Version 1.0")
end
function itimetux.saluda(x)
print("Hola "..x.." soy itimetux")
end
return itimetux
Ahora podemos usar la función privada desde el modulo pero no la podremos usar desde el programa principal.
Para no usar un nuevo nombre basta con hacer que la tabla no sea local,en vez de:
local itimetux = {}
Usamos:
itimetux = {}
Y en programa principal usamos:
require 'itimetux'
itimetux.info()
Hay otra manera de crear módulos,el cual es que no tengamos que usar una tabla,es un metodo mas raro,ya que tenemos que retornar cada función,pero se puede hacer de esta manera tambien:
local function dominio() -- funcion privada
return "http://www.itimetux.com"
end
local function info()
print("Dominio : "..dominio())
print("Version 1.0")
end
local function saluda(x)
print("Hola "..x.." soy itimetux")
end
return { info = info ,saluda = saluda} -- retornamos las funciones que usaremos en el programa principal,las demas seran privadas
En el programa principal se puede usar de la misma manera el modulo.
Vamos a hacer algo mas útil,vamos a crear un modulo que lea los contenidos de un directorio:
local function read(dir)
local _files = {} -- Creamos una tabla para guardar los archivos
local i = 1
for files in io.popen("ls "..dir):lines() do -- Iteramos con un pipe,que use ls(funcion del sistema)
table.insert(_files,i,files) -- Insertamos en la tabla los archivos
i = i + 1
end
return _files -- Regresamos una tabla con los archivos (return de la funcion)
end
return {read = read} -- Regresamos la funcion (return del modulo)
Ahora supongamos que le llamamos readdir.lua y lo tenemos en lib/,para llamarlo en el programa principal hacemos esto:
readir = require 'lib.readdir'
archivos = readir.read(".") -- Leemos los archivos del directorio actual
-- Y por ultimo iteramos:
for i=1,#archivos do -- De i al numero de elementos de la tabla
io.write(string.format("Archivo %d : %s\n",i,archivos[i])) -- Formateamos la cadena
end
Eso es todo de la parte 1,faltan cosas mas avanzadas las cuales hacen uso de metatablas,entornos,etc,pero primero haré tutoriales sobre eso para que se entienda mejor.
No hay comentarios.:
Publicar un comentario
Los comentarios serán revisados antes de ser publicados.