Предоставление модулям доступа к Local в родительском скрипте - PullRequest
0 голосов
/ 08 мая 2018

Обновление:

Дальнейшее чтение ( локальная переменная не видна в замыкании по файлу? ) дало мне «ага!»момент, чтобы точно понять, почему мой код не работал.

В 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) могла бы решить эту проблему ... может быть, и нет.

Приветствия.

1 Ответ

0 голосов
/ 08 мая 2018

Это проблема с круговыми зависимостями. Я замечаю, что Element и Button идут внутрь GUI, но они не зависят от GUI для своей конструкции. Помещение Element в собственный файл позволит вам сделать все локальным.

-- Core.lua --

local GUI = {}

-- Template for GUI elements
GUI.Element = require 'Element'

GUI.Button = require 'Button'

return GUI

-- Element.lua --

return {
  new = function(self, name)
    local elm = {}
    setmetatable(elm, self)
    self.__index = self
    return elm
  end,
}

-- Class - Button.lua --

Button = require('Element'):new()
function Button:draw()
end

return Button
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...