进一步阅读(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)
功能可以解决这个问题......但也许并非如此。
干杯。
答案 0 :(得分:0)
这是循环依赖的问题。我注意到Element
和Button
在 GUI
内部,但他们<{1}}上的依赖施工。将GUI
放在自己的文件中将允许您将所有内容都放在本地。
Element