我正在用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中对其进行评估。
但是,由于脚本已运行,所以在Lua中objectTwo不再存在,因此它尝试在nil上调用setProperties并崩溃。
我的问题是,如何确保在handleOnClick中仍可以引用objectTwo?我宁愿不要将其放在全局注册表中,以免污染名称空间。
我可以对闭包做些什么吗?
[构造objectOne
时,local objectTwo
变量尚不在范围内,因此Lua假定从从未定义的全局变量objectTwo
中读取,因此在读取时返回nil
。
至少将local objectTwo
声明移到引用它的代码之前。您不必在那里定义对象,可以稍后进行分配。但是变量声明必须在要访问它的代码之前。
也请注意数据/代码的所有权。您说过“将其转换为自定义C ++类”,而没有额外的细节。您应该意识到,必须将回调函数的Lua值存储在某个地方。无论是注册表还是某些类拥有的表,但仍存储在Lua可以访问的某个位置,因此稍后不会再对回调函数进行垃圾收集。