在脚本运行后引用 lua 表/对象

Referencing lua table/object after script has been run

本文关键字:对象 lua 引用 脚本 运行      更新时间:2023-10-16

我正在Lua中设计一个GUI系统,绑定到C++。我不会在这里讨论不必要的细节,但本质上创建表单的 lua 脚本如下所示:

local objectTwo = Gui:newObject{
position = {10,10},
size = {100,100},
}
local objectOne = Gui:newObject{
position = {10,10},
size = {100,100},
handleOnClick = function(x, y, button)
objectTwo:setProperties{
hidden = false
}
end
}

本质上,newObject 将表传递到C++,handleOnClick 被转换为自定义C++函数类。单击该对象时,它会调用该函数类,并在 Lua 中对其进行计算。

但是,objectTwo 在 Lua 中不再存在,因为脚本已经运行,因此它尝试在 nil 上调用 setProperties 并崩溃。

我的问题是,如何确保对象二仍然可以在handleOnClick中引用?我宁愿不将其放在全局注册表或类似注册表中,以避免污染命名空间。

我可以用关闭做些什么吗?

构造objectOne时,local objectTwo变量尚未在作用域中,因此Lua假定从全局变量objectTwo读取,该变量从未定义过,因此在读取时返回nil

至少将local objectTwo声明移到将引用它的代码之前。您不必在那里定义对象,稍后可以执行分配。但是变量声明必须在想要访问它的代码之前。

还要注意数据/代码的所有权。您说您"将其转换为自定义C++类",但没有额外的细节。您应该知道,您必须将回调函数的 Lua 值存储在某处。无论是注册表,还是一些类拥有的表,但仍然存储在Lua可以访问的地方,因此回调函数不会在以后的某个时刻被垃圾回收。