Latest web development tutorials

Moduł pakietu Lua

Moduł jest podobny do pakietu biblioteki, począwszy od Lua 5.1 Lua dodania standardowego mechanizmu zarządzania Moduł można umieścić jakiś wspólny kod w jednym pliku, w postaci interfejsu API połączeń w innych miejscach, na rzecz ponownego wykorzystania kodu i zmniejszyć sprzęgło code.

Moduł Lua jest tabela ze zmiennych, funkcji i innych znanych elementów, tworząc w ten sposób bardzo prosty moduł, jest stworzenie tabeli, wówczas należy wyeksportować stałych, funkcji, do której w końcu wrócił do stołu na linii. Poniżej zamieszczona jest stworzenie modułu niestandardowego module.lua, format kodu plik jest w następujący sposób:

-- 文件名为 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

Z powyższego wynika, struktura modułu jest strukturą tabeli, więc można wywołać tabelę jako element w działaniu do działania jako stała w module wywołującego lub funkcji.

Powyższy func2 zadeklarowane jako zmienne lokalne zablokować, co oznacza, że ​​prywatny funkcji, a zatem nie mogą być dostępne z zewnątrz prywatnej modułu funkcyjnego musi być wywoływana przez moduł funkcji publicznej.


wymagają funkcji

Lua posiada funkcję o nazwie wymagają służy do ładowania modułów. Aby załadować moduł, wystarczy nazwać. Na przykład:

require("<模块名>")

lub

require "<模块名>"

Wrócimy po wykonaniu wymagają stałej lub funkcji przez moduł składający się z tabeli i będzie zdefiniować zmienną globalną, która zawiera tabelę.

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

Powyższy kod jest wykonywany w wyniku:

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

Albo załadować moduły zdefiniować zmienną aliasu, łatwe połączenie:

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

Powyższy kod jest wykonywany w wyniku:

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

mechanizm Ładowanie

W przypadku modułów niestandardowych, a nie na który katalog plików zrobi, wymagają funkcja ma własną strategię ładowania ścieżka do pliku, próbuje załadować plik modułu z Lua lub C biblioteki programu.

Wymagaj ścieżka wyszukiwania dla pliku Lua jest przechowywany w zmiennej globalnej package.path po butach Lua, LUA_PATH początkowa wartość zmiennej środowiskowej do zmiennej środowiskowej. Jeśli nie możesz znaleźć zmienną środowiskową, domyślna ścieżka zdefiniowana przez inicjalizacji kompilacji.

Oczywiście, jeśli nie ma LUA_PATH tej zmiennej, można również dostosować ustawienia, otwarta w katalogu domowym plik .profile bieżącego użytkownika (nie tworzyć, można również otworzyć plik .bashrc), na przykład, "~ / lua /" Droga do przyłączenia środowiska LUA_PATH zmienna:

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

Ścieżka do pliku "," rozdzielone finałowej dwójki ";;" oznacza nowo dodatkowy plus oryginalnej ścieżki domyślnej ścieżce.

Następnie zaktualizować parametry zmienne środowiskowe są uwzględniane natychmiast.

source ~/.profile

Następnie package.path zakładane są następujące wartości:

/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

Więc kiedy dzwoni require ( "moduł") będzie próbował otworzyć następujące katalogi plików, aby szukać celów.

/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

Jeśli zbliżył plik docelowy zostanie wywołana package.loadfile załadować moduły. W przeciwnym razie przejdź do bibliotek C.

Ścieżka wyszukiwania plików jest package.cpath uzyskane od zmiennej globalnej, a ta zmienna jest LUA_CPATH wstępnych zmiennych środowiskowych.

Strategia wyszukiwania z taka sama jak wyżej, ale teraz jest poszukiwanie takiej zamiany lub typ pliku DLL. Jeśli je znajdziesz, to będzie to wymagało od package.loadlib aby go załadować.


pakiet C

Lua i C są łatwo połączyć za pomocą C napisać pakiet Lua.

Napisz inny pakiet i Lua, pakiet C przed użyciem musi najpierw zostać załadowany i podłączony, w większości systemów jest najprostszym sposobem osiągnięcia mechanizmy Dynamic Link Library.

Lua zapewnia pełną funkcjonalność dynamicznego łączenia w funkcję o nazwie LOADLIB. Ta funkcja przyjmuje dwa argumenty: bezwzględną ścieżkę do funkcji biblioteki i inicjalizacji. Tak przykładem typowe połączenia jest:

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

Funkcja LOADLIB ładuje określony bibliotekę i podłączony do Lua, ale nie otworzyć bibliotekę (czyli bez funkcji inicjowania połączeń), w przeciwnym razie wraca funkcję inicjalizacji w funkcji Lua, tak, że możemy nazwać go bezpośrednio w Lua.

Jeśli wystąpił błąd podczas ładowania biblioteki dynamicznej lub inicjalizacji funkcja wyszukiwania, LOADLIB zwraca komunikaty o błędach i zerowe. Możemy zmodyfikować poprzednią sekcję kodu do wykrywania błędów, a następnie wywołać funkcję inicjalizacji:

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

W normalnych okolicznościach oczekujemy uwolnienie biblioteki binarnym zawiera poprzedni fragment kodu plik podobny pośredniczącego, pliki binarne instalacji można łatwo umieścić w katalogu, wystarczy zmodyfikować plik binarny pliku pośredniczącego biblioteki odpowiada rzeczywistej ścieżki.

Katalog, w którym plik został dodany do LUA_PATH skrótowej, ustawienie to może być stosowane po załadowaniu biblioteki C funkcje nakazania.