Некоторые библиотеки работают только в одну сторону, а некоторые работают только в другую сторону
Синтаксис require "name"
был введен в lua 5.1; как примечание; этот вызов не всегда возвращает модуль; но ожидалось, что будет создано глобальное имя библиотеки (так что теперь у вас есть _G.name
для использования библиотеки). Например, в более ранних версиях gsl, если вы сделали local draw = require"draw"
, локальный draw
будет содержать true
; и тень на глобальный draw
, созданный библиотекой.
Вышеуказанное поведение поощряется функцией module
==>, которая теперь относительно не рекомендуется, любой хорошо написанный новый код не будет ее использовать.
Синтаксис local name = require"name"
стал предпочтительным в последнее время (около 2008 года?); когда было решено, что модули, устанавливающие для вас глобальные переменные, были плохой вещью
Как пункт: все мои библиотеки не устанавливают глобальные переменные, а просто возвращают таблицу функций; или в некоторых других случаях они возвращают функцию, которая работает как инициализатор для корневого объекта.
tldr;
В новом коде вы должны использовать последний синтаксис local name = require"name"
; он работает в подавляющем большинстве случаев, но если вы работаете с некоторыми старыми модулями, они могут не поддерживать его, и вам придется просто использовать require"module"
.
Чтобы ответить на ваш добавленный вопрос :
вам требуются системные модули ?: нет; вы просто предполагаете, что они уже необходимы; но я локализую все используемые мной функции (обычно сгруппированные по строкам по модулю, из которого они поступили), в том числе из внешних библиотек. Это позволяет легко увидеть, на какие функции действительно опирается ваш код; а также удаление всех GETGLOBAL из вашего байт-кода.
Редактировать: локализация функций теперь не рекомендуется. Чтобы найти случайные глобалы, используйте линтер типа luacheck
Пример модуля в (моем) предпочтительном стиле ; будет работать только с синтаксисом local name = require"name"
.
local my_lib = require"my_lib"
local function foo()
print("foo")
end
local function bar()
print("bar", my_lib.new())
end
return {
foo = foo;
bar = bar;
}