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

我正在用Lua设计一个绑定到C ++的GUI系统。我不会在这里进入不必要的细节,但基本上创建表单的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中引用objectTwo?我宁愿不将其放入全局注册表或类似的地方,以避免污染命名空间。

闭包可以做些什么吗?

点赞
用户5675002
用户5675002

objectOne正在构建时,本地变量local objectTwo还不在作用域内,因此Lua会认为在读取全局变量objectTwo,而该变量从未被定义,因此在读取时返回nil

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

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

2019-10-12 17:13:38