Latest web development tutorials

пакет модуля Lua

Модуль похож на пакет библиотеки, начиная с Lua 5.1, Lua добавлен стандартный механизм управления модулем, вы можете поместить общий код в одном файле, в виде API интерфейса вызовов в других местах, в пользу повторного использования кода и уменьшить Код муфты.

Модуль Lua представляет собой таблицу из переменных, функций и других известных элементов, создавая тем самым очень простой модуль, чтобы создать таблицу, то необходимо экспортировать константы, функции, в которые, в конце концов вернулся к столу на линии. Далее создает пользовательский модуль module.lua, формат кода файла выглядит следующим образом:

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

Из сказанного выше, структура модуля является структура таблицы, так что вы можете позвонить в таблицу в качестве элемента операции, чтобы работать в качестве константы в модуле вызова или функции.

Выше func2 объявлен как блок локальных переменных, это означает, что собственная функция, и, следовательно, не могут быть доступны из-за пределов частного функционального модуля должен вызываться модулем публичной функции.


требуют функции

Lua предоставляет функцию требуют используется для загрузки модулей. Чтобы загрузить модуль, просто вызовите его. Например:

require("<模块名>")

или

require "<模块名>"

Вернется после выполнения требуют постоянной или функции с помощью модуля, состоящего из таблицы, и будет определять глобальную переменную, которая содержит таблицу.

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

Приведенный выше код выполняется в результате:

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

Или загрузить модули определяют переменную псевдоним, легкий вызов:

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

Приведенный выше код выполняется в результате:

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

механизм загрузки

Для пользовательских модулей, а не на котором будут делать каталог файлов, требуется функция имеет свою собственную стратегию путь к файлу загрузки, он пытается загрузить файл модуля из библиотеки программы Lua или C.

Требовать путь поиска для Lua файла сохраняется в глобальной переменной package.path, после загрузки Lua, LUA_PATH начальное значение переменной окружения переменной окружения. Если вы не можете найти переменную окружения, путь по умолчанию определяется инициализации во время компиляции.

Конечно, если там нет LUA_PATH эту переменную окружения, вы также можете настроить параметры, откройте в файле .profile домашней директории текущего пользователя (он не создает, вы также можете открыть файл .bashrc), например, "~ / Lua /" Путь присоединиться к LUA_PATH среды переменная:

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

Путь к файлу "," отделены друг от друга двух последних ";;" означает новодобавленный плюс изначального пути пути по умолчанию.

Затем обновить параметры переменные среды вступают в силу немедленно.

source ~/.profile

Тогда package.path Предполагаемые значения:

/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

Так что при вызове требуется ( "модуль") будет пытаться открыть следующие каталоги файлов для поиска целей.

/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

Если подошел к целевой файл будет называться package.loadfile для загрузки модулей. В противном случае перейдите к библиотекам C.

поиск Файл путь package.cpath получается из глобальной переменной, и эта переменная LUA_CPATH для начальных переменных окружения.

Стратегия поиска с тем же, что и выше, но теперь поиск так заменен или тип файла DLL. Если вы ее нашли, то это потребует от package.loadlib, чтобы загрузить его.


пакет C

Lua и C легко комбинируются с помощью C, чтобы написать пакет Lua.

Написать другой пакет и Lua, C пакет Перед первым использованием должен быть загружен и подключен, в большинстве систем это самый простой способ для достижения динамических механизмов библиотечных ссылок.

Lua обеспечивает все функциональные возможности динамического связывания в функции называется loadlib. Эта функция принимает два аргумента: абсолютный путь к библиотечной функции и инициализации. Таким образом, пример типичного вызова:

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

Функция loadlib загружает указанную библиотеку и подключен к Lua, но она не открывает библиотеку (т.е. без функции инициализации вызова), в противном случае он возвращает функцию инициализации как функцию Lua, так что мы можем назвать его непосредственно в Lua.

Если произошла ошибка при загрузке динамической библиотеки или инициализации функции поиска, loadlib возвращает ноль и сообщения об ошибках. Мы можем изменить предыдущий раздел кода для обнаружения ошибок, а затем вызвать функцию инициализации:

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

В нормальных условиях мы ожидаем, что выпуск бинарной библиотеки содержит предыдущем фрагменте кода файла аналогичен незавершенная, бинарные файлы установки могут быть легко размещены в каталоге, вам нужно всего лишь изменить двоичный файл библиотеки окурка соответствует реальному пути.

Каталог, в котором файл был добавлен к заглушке LUA_PATH, этот параметр может быть использован после загрузки библиотеки C функции требуют.