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, а имя файла - 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, и, следовательно, модуль должен быть предпочтительно реализован, как показано выше, хотя вы можете найти другие типы реализаций в другом месте.

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

Позвольте мне теперь переписать тот же пример более старым способом, который использует тип реализации 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, не рекомендуют его использование.