让模块在父脚本

时间:2018-05-08 14:42:14

标签: lua scoping

更新

进一步阅读(local variable cannot be seen in a closure across the file?)给了我一个"啊哈!"关于为什么我的代码没有工作的时刻。

在Lua中, local x 对同一范围内的任何东西都是可见的 - 同一个函数中的东西,if / then结构,for循环,从该函数调用的其他函数等,但其他模块,即使他们是在本地范围内调用的。我没有找到比#34更好的解释;因为原因",只是知道模块是"正常"的例外。范围行为至少让我放心。

原帖:

(非常抱歉,如果有这样的答案;我已经谷歌搜索了几个小时并且做空了。)

我为我首选的音频软件(Reaper)编写了一个GUI库。在录制/播放过程中脚本有很强的运行潜力,因此性能是一个大问题,我试图尽可能地保留所有内容。总的来说很简单,但是在脚本中使用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中的第23行--Lay.lua"),这导致我假设模块仍然保持在自己的范围内,并且我的本地 GUI 实际上没有被触及。

我还尝试让 Core.lua 直接返回 GUI 表,因此主脚本可以有local GUI = loadfile("Core.lua")(),但我遇到了如上所述,给元素模块访问它的麻烦。我知道,范围。

所以,鉴于上述所有情况,是否有正确的"编写/构建模块的方式,以便一切都在本地 GUI 中结束?我得到的印象是,已解散的module(..., package.seeall)功能可以解决这个问题......但也许并非如此。

干杯。

1 个答案:

答案 0 :(得分:0)

这是循环依赖的问题。我注意到ElementButtonGUI内部,但他们<{1}}上的依赖施工。将GUI放在自己的文件中将允许您将所有内容都放在本地。

Element