Учебники

Lua — модули

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

Специальность модулей Lua

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

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

В приведенном выше примере кода вы можете увидеть, насколько гибким является программирование на Lua без какого-либо специального дополнительного кода.

Требуемая функция

Lua предоставила высокоуровневую функцию под названием require для загрузки всех необходимых модулей. Он поддерживается настолько простым, насколько это возможно, чтобы избежать слишком большой информации о модуле для его загрузки. Функция require принимает модули как кусок кода, который определяет некоторые значения, которые на самом деле являются функциями или таблицами, содержащими функции.

пример

Рассмотрим простой пример, где одна функция имеет математические функции. Давайте назовем этот модуль mymath.lua, а имя файла — mymath.lua. Содержание файла выглядит следующим образом —

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	

Теперь, чтобы получить доступ к этому модулю Lua в другом файле, скажем, moduletutorial.lua, вам нужно использовать следующий сегмент кода.

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

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

30
10
200
1.5

То, что нужно запомнить

  • Поместите оба модуля и файл, который вы запускаете, в один каталог.

  • Имя модуля и его имя файла должны совпадать.

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

Поместите оба модуля и файл, который вы запускаете, в один каталог.

Имя модуля и его имя файла должны совпадать.

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

Старый способ реализации модулей

Позвольте мне теперь переписать тот же пример более старым способом, который использует реализацию типа package.seeall. Это использовалось в Lua версий 5.1 и 5.0. Модуль mymath показан ниже.

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

Использование модулей в moduletutorial.lua показано ниже.

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

Когда мы запустим вышеупомянутое, мы получим тот же результат. Но рекомендуется использовать более старую версию кода, и предполагается, что она менее безопасна. Многие SDK, которые используют Lua для программирования, такие как Corona SDK, не рекомендовали использовать это.