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

问题描述 投票:1回答:1

我正在用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?我宁愿不要将其放在全局注册表中,以免污染名称空间。

我可以对闭包做些什么吗?

c++ user-interface lua scripting
1个回答
0
投票

[构造objectOne时,local objectTwo变量尚不在范围内,因此Lua假定从从未定义的全局变量objectTwo中读取,因此在读取时返回nil

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

也请注意数据/代码的所有权。您说过“将其转换为自定义C ++类”,而没有额外的细节。您应该意识到,必须将回调函数的Lua值存储在某个地方。无论是注册表还是某些类拥有的表,但仍存储在Lua可以访问的某个位置,因此稍后不会再对回调函数进行垃圾收集。

© www.soinside.com 2019 - 2024. All rights reserved.