Обновление:
Дальнейшее чтение ( локальная переменная не видна в замыкании по файлу? ) дало мне «ага!»момент, чтобы точно понять, почему мой код не работал.
В Lua local x виден всему, что находится в той же области видимости - вещи в той же функции, если / то структуры, дляциклы, другие функции, вызываемые из этой функции, и т. д., но не других модулей, даже если они вызываются из области видимости локального интерфейса.Я не нашел лучшего объяснения, чем «потому что причины», но простое знание того, что модули являются исключением из «нормального» поведения области видимости, по крайней мере, успокаивает меня.
Оригинальный пост:
(Ужасно извините, если есть ответ на этот вопрос; я уже несколько часов гуглю и недоразвит.)
Я написал библиотеку графического интерфейса для моего предпочтительного аудио программного обеспечения (Reaper).Существует большой потенциал для запуска сценариев во время записи / воспроизведения, поэтому производительность является большой проблемой, и я стараюсь сохранить все локальное, где это возможно.В общем, все достаточно просто, но у меня возникают небольшие проблемы с использованием библиотеки GUI + классов элементов в скрипте.
Основной модуль GUI:
-- Core.lua --
local function GUI_table()
local GUI = {}
-- Template for GUI elements
GUI.Element = {}
function GUI.Element:new(name)
local elm = {}
setmetatable(elm, self)
self.__index = self
return elm
end
...add a bunch of GUI.do_this = function()....
return GUI
end
GUI = GUI_table()
Всеэлементов GUI представляют собой отдельные файлы одинаковой формы:
-- Class - Button.lua --
if not GUI then throw_a_missing_library_error_and_quit end
GUI.Button = GUI.Element:new()
function GUI.Button:draw()
...etc...
В настоящее время я загружаю их из родительского скрипта через loadfile("Core.lua")()
.Это работает достаточно хорошо, но оно помещает GUI в глобальную таблицу с соответствующими издержками для поиска.Попытка переписать вещи так, чтобы GUI мог быть локальным, до сих пор не удалась.Я пробовал:
local GUI
loadfile("Core.lua")()
loadfile("Class - Button.lua")()
...
Сбой, потому что все вызовы GUI основного сценария идут в локальный _GUI, но загруженные файлы не могут видеть или добавлять его из-за области видимости.
loadfile("Core.lua")()
loadfile("Class - Button.lua")()
local GUI = GUI
Работает нормально, но с точки зрения производительности ничего не меняет: ошибки в коде модуля по-прежнему связаны с модулем (т. Е. «Строка 23 в классе - Button.lua»), что заставляет меня предположить, чтомодули все еще находятся в пределах их собственной области видимости, и мой локальный GUI фактически не затрагивается.
Я также пытался заставить Core.lua вернуть * 1044Таблица * GUI напрямую, поэтому основной сценарий может иметь local GUI = loadfile("Core.lua")()
, но я столкнулся с проблемой предоставления доступа к ней элементным модулям, как описано выше.Я знаю, область видимости.
Итак, учитывая все вышесказанное, существует ли "правильный" способ написания / структурирования модулей, чтобы все заканчивалось локальным GUI ?У меня складывается впечатление, что несуществующая функциональность module(..., package.seeall)
могла бы решить эту проблему ... может быть, и нет.
Приветствия.