Latest web development tutorials

pacchetto del modulo Lua

Il modulo è simile a un pacchetto di libreria, a partire da Lua 5.1, Lua aggiunto meccanismo di gestione modulo standard, si può mettere un po 'di codice comune in un unico file, sotto forma di chiamate di interfaccia API in altri luoghi, in favore del riutilizzo del codice e ridurre accoppiamento del codice.

Modulo Lua è la tabella delle variabili, funzioni e altri elementi noti, creando così un modulo molto semplice, è quello di creare una tabella, quindi la necessità di esportare le costanti, funzioni in cui, finalmente tornato al tavolo sulla linea. Quanto segue è la creazione di un module.lua modulo personalizzato, il formato di file di codice è il seguente:

-- 文件名为 module.lua
-- 定义一个名为 module 的模块
module = {}
 
-- 定义一个常量
module.constant = "这是一个常量"
 
-- 定义一个函数
function module.func1()
    io.write("这是一个公有函数!\n")
end
 
local function func2()
    print("这是一个私有函数!")
end
 
function module.func3()
    func2()
end
 
return module

Da quanto precede, la struttura del modulo è una struttura di tabella, così si può chiamare la tabella come elemento nell'operazione di operare come una costante nel modulo di chiamata o funzione.

Il funz2 sopra dichiarati come variabili locali bloccano, che significa una funzione privata, e quindi non si può accedere dall'esterno del modulo funzione privata deve essere chiamato dalla funzione pubblica del modulo.


richiedono la funzione

Lua offre una funzione chiamata richiedono viene utilizzato per caricare i moduli. Per caricare un modulo, è sufficiente chiamare. Ad esempio:

require("<模块名>")

o

require "<模块名>"

Torneremo dopo l'esecuzione richiede una costante o funzione da un modulo costituito da tavolo, e definire una variabile globale che contiene la tabella.

-- test_module.lua 文件
-- module 模块为上文提到到 module.lua
require("module")
 
print(module.constant)
 
module.func3()

Il codice precedente viene eseguito come risultato di:

这是一个常量
这是一个私有函数!

O per caricare i moduli definire una variabile alias, chiamata facile:

-- test_module2.lua 文件
-- module 模块为上文提到到 module.lua
-- 别名变量 m
local m = require("module")
 
print(m.constant)
 
m.func3()

Il codice precedente viene eseguito come risultato di:

这是一个常量
这是一个私有函数!

meccanismo di caricamento

Per i moduli personalizzati, non su cui farà directory del file, richiede la funzione ha la propria strategia di percorso del file di caricamento, si cerca di caricare il file modulo dalla biblioteca programma Lua o C.

Richiede percorso di ricerca per file di Lua viene memorizzato nella package.path variabile globale, dopo l'avvio del Lua, LUA_PATH valore iniziale della variabile d'ambiente per la variabile d'ambiente. Se non trovate la variabile d'ambiente, il percorso predefinito definito da una inizializzazione in fase di compilazione.

Naturalmente, se non vi è alcuna LUA_PATH questa variabile di ambiente, è anche possibile personalizzare le impostazioni, aperto nel file .profile directory home dell'utente corrente (non crea, si può anche aprire il file .bashrc), per esempio, il percorso "~ / lua /" per unirsi ambiente LUA_PATH variabili:

#LUA_PATH
export LUA_PATH="~/lua/?.lua;;"

Percorso del file "," separati dal finale due ";;" sta per l'appena aggiunto più il percorso originale del percorso predefinito.

Successivamente, aggiornare i parametri variabili di ambiente a effetto immediato.

source ~/.profile

Poi valori package.path assunti sono:

/Users/dengjoe/lua/?.lua;./?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua;/usr/local/lib/lua/5.1/?.lua;/usr/local/lib/lua/5.1/?/init.lua

Così, quando si chiama richiedere ( "modulo") cercherà di aprire le seguenti directory di file per la ricerca di obiettivi.

/Users/dengjoe/lua/module.lua;
./module.lua
/usr/local/share/lua/5.1/module.lua
/usr/local/share/lua/5.1/module/init.lua
/usr/local/lib/lua/5.1/module.lua
/usr/local/lib/lua/5.1/module/init.lua

Se avvicinato il file di destinazione sarà chiamato package.loadfile per caricare i moduli. In caso contrario, andare a librerie C.

percorso di ricerca dei file è package.cpath ottenuto da una variabile globale, e questa variabile è LUA_CPATH alle variabili di ambiente iniziali.

Strategia di ricerca con lo stesso come sopra, ma ora la ricerca è così sostituito o tipo di file dll. Se lo trovate, allora sarà necessario per package.loadlib per caricarlo.


pacchetto C

Lua e C sono facilmente combinati utilizzando C di scrivere pacchetto Lua.

Scrivi un pacchetto e Lua diverso, pacchetto C prima dell'uso deve prima essere caricato e collegato, nella maggior parte dei sistemi è il modo più semplice per ottenere meccanismi di libreria di collegamento dinamico.

Lua offre tutte le funzionalità di linking dinamico in una funzione chiamata loadlib. Questa funzione prende due argomenti: il percorso assoluto per la funzione di libreria e l'inizializzazione. Così un esempio di una tipica chiamata è:

local path = "/usr/local/lua/lib/libluasocket.so"
local f = loadlib(path, "luaopen_socket")

Funzione loadlib carica la libreria specificata e collegato a Lua, ma non si apre la libreria (vale a dire senza la funzione di inizio di chiamata), altrimenti ritorna funzione di inizializzazione come funzione Lua, in modo che lo possiamo chiamare direttamente in Lua.

Se si è verificato l'errore durante il caricamento di una libreria dinamica o l'inizializzazione funzione di ricerca, loadlib restituisce i messaggi nil e di errore. Siamo in grado di modificare la sezione precedente di codice per rilevare gli errori e quindi chiamare la funzione di inizializzazione:

local path = "/usr/local/lua/lib/libluasocket.so"
-- 或者 path = "C:\\windows\\luasocket.dll",这是 Window 平台下
local f = assert(loadlib(path, "luaopen_socket"))
f()  -- 真正打开库

In circostanze normali ci aspettiamo che il rilascio della libreria binario contiene un precedente file simile stub frammento di codice, i file binari di installazione può essere facilmente posizionato in una directory, è sufficiente modificare il file di libreria di stub binario corrisponde al percorso effettivo.

La directory in cui il file è stato aggiunto alla LUA_PATH stub, questa impostazione può essere utilizzato dopo il caricamento della libreria C funzioni richiedono.