Lua - Moduli

Cos'è un modulo?

Il modulo è come una libreria che può essere caricata utilizzando require e ha un unico nome globale contenente una tabella. Questo modulo può essere costituito da una serie di funzioni e variabili. Tutte queste funzioni e variabili sono inserite nella tabella, che funge da spazio dei nomi. Inoltre, un modulo ben funzionante ha le disposizioni necessarie per restituire questa tabella su require.

Specialità dei moduli Lua

L'utilizzo di tabelle nei moduli ci aiuta in molti modi e ci permette di manipolare i moduli nello stesso modo in cui manipoliamo qualsiasi altra tabella Lua. Come risultato della capacità di manipolare i moduli, fornisce funzionalità extra per le quali altri linguaggi richiedono meccanismi speciali. A causa di questo meccanismo gratuito di moduli in Lua, un utente può chiamare le funzioni in Lua in diversi modi. Alcuni di loro sono mostrati di seguito.

-- 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")

Nel codice di esempio sopra, puoi vedere quanto sia flessibile la programmazione in Lua, senza alcun codice aggiuntivo speciale.

La funzione require

Lua ha fornito una funzione di alto livello chiamata require per caricare tutti i moduli necessari. È mantenuto il più semplice possibile per evitare di avere troppe informazioni sul modulo per caricarlo. La funzione require assume i moduli solo come un pezzo di codice che definisce alcuni valori, che in realtà sono funzioni o tabelle che contengono funzioni.

Esempio

Consideriamo un semplice esempio, in cui una funzione ha le funzioni matematiche. Chiamiamo questo modulo come mymath e il nome del file è mymath.lua. Il contenuto del file è il seguente:

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

Ora, per accedere a questo modulo Lua in un altro file, ad esempio moduletutorial.lua, è necessario utilizzare il seguente segmento di codice.

mymathmodule = require("mymath")
mymathmodule.add(10,20)
mymathmodule.sub(30,20)
mymathmodule.mul(10,20)
mymathmodule.div(30,20)

Per eseguire questo codice, è necessario posizionare i due file Lua nella stessa directory o, in alternativa, è possibile posizionare il file del modulo nel percorso del pacchetto e necessita di una configurazione aggiuntiva. Quando eseguiamo il programma precedente, otterremo il seguente output.

30
10
200
1.5

Cose da ricordare

  • Posiziona entrambi i moduli e il file che esegui nella stessa directory.

  • Il nome del modulo e il nome del file dovrebbero essere gli stessi.

  • È una buona pratica restituire i moduli per la funzione require e quindi il modulo dovrebbe essere preferibilmente implementato come mostrato sopra, sebbene sia possibile trovare altri tipi di implementazioni altrove.

Vecchio modo di implementare i moduli

Vorrei ora riscrivere lo stesso esempio nel modo precedente, che utilizza il tipo di implementazione package.seeall. Questo è stato utilizzato nelle versioni Lua 5.1 e 5.0. Il modulo di matematica è mostrato di seguito.

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

Di seguito è mostrato l'utilizzo dei moduli in moduletutorial.lua.

require("mymath")
mymath.add(10,20)
mymath.sub(30,20)
mymath.mul(10,20)
mymath.div(30,20)

Quando eseguiamo quanto sopra, otterremo lo stesso output. Ma si consiglia di utilizzare la versione precedente del codice e si presume che sia meno sicura. Molti SDK che utilizzano Lua per la programmazione come Corona SDK ne hanno deprecato l'uso.