Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在脚本运行后引用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 } 基本上NeWORKORT对象将表传递到C++,HANDLONCKET被转换为自定义C++函数类。单击该对象时,它将调用该函数类,并在Lua中对其求值_C++_User Interface_Lua_Scripting - Fatal编程技术网

在脚本运行后引用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 } 基本上NeWORKORT对象将表传递到C++,HANDLONCKET被转换为自定义C++函数类。单击该对象时,它将调用该函数类,并在Lua中对其求值

在脚本运行后引用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 } 基本上NeWORKORT对象将表传递到C++,HANDLONCKET被转换为自定义C++函数类。单击该对象时,它将调用该函数类,并在Lua中对其求值,c++,user-interface,lua,scripting,C++,User Interface,Lua,Scripting,但是,由于脚本已经运行,objectTwo在Lua中不再存在,因此它尝试在nil上调用setProperties并崩溃 我的问题是,如何确保objectTwo仍然可以在handleOnClick中引用?我不希望将它放在全局注册表或类似的地方,以避免污染名称空间 我可以用闭包做些什么吗?当构建objectOne时,local objectTwo变量还不在范围内,因此Lua假设从全局变量objectTwo读取,该变量从未定义过,因此读取时返回nil 至少将localobjecttwo声明移动到将引用

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

我的问题是,如何确保objectTwo仍然可以在handleOnClick中引用?我不希望将它放在全局注册表或类似的地方,以避免污染名称空间


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

当构建
objectOne
时,
local objectTwo
变量还不在范围内,因此Lua假设从全局变量
objectTwo
读取,该变量从未定义过,因此读取时返回
nil

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


还要注意数据/代码的所有权。你说你没有特殊细节就把它转换成自定义C++类。您应该知道,必须将回调函数的Lua值存储在某个位置。无论是注册表还是某个类拥有的表,但仍然存储在Lua可以访问的地方,因此回调函数不会在稍后的某个时刻被垃圾收集。

当构建
objectOne
时,
local objectTwo
变量还不在范围内,因此,Lua假设从全局变量
objectTwo
读取数据,该变量从未定义过,因此读取时返回
nil

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


还要注意数据/代码的所有权。你说你没有特殊细节就把它转换成自定义C++类。您应该知道,必须将回调函数的Lua值存储在某个位置。不管是注册表还是某个类拥有的表,但仍然存储在Lua可以访问的地方,因此回调函数不会在稍后被垃圾收集。

啊,是的,我写错了。我对其进行了编辑,以反映Object2确实是在objectOne之前声明的。。。似乎Object2仍在某种程度上超出范围。使用注册表将对象转换为C++。我确信他们不是垃圾回收,直到C++代码破坏了引用Lua对象的C++对象。@直到收集到代码< > Healon点击> /Cuff>之前,不能调用@ KingCoyote <代码> Objuts2 < /Cord>。
objectTwo
位于回调的词法闭包中。您是否将
objectOne
存储在某个地方?它是脚本的局部块,如果它没有存储在其他地方,它将被GC'ED,并且C++的析构函数将清理所有其他(如果做得好),包括回调函数,所以<代码> Objuts2[/Cudio]将被清理。Objuts2和ObjutOne都被存储在注册表中,作为属于两个单独的C++对象的参考文献。回调函数引用也存储在持有对象ObjutOne的C++对象中。@ KeCooOutE C++对象位于注册表中。那么
Gui:newObject
的输入参数呢?那些带参数的表,如何处理其中的数据?回调是一个Lua对象,而不仅仅是指向某些代码的指针。它必须保存在Lua-in注册表中,或者嵌套在注册表中存储的对象拥有的表中。C++中的函数GUI:NeWObjor采用输入表并重新引用,将其存储在C++中。这个表由newObject返回到lua中。本质上,C++对象保存对传入NeWObject的表的引用,并且该函数也被返回到LUA中,因此可以在别处使用。整个表,大小,位置,和手上点击功能,是REF和存储在C++中。啊,是的,我写错了。我对其进行了编辑,以反映Object2确实是在objectOne之前声明的。。。似乎Object2仍在某种程度上超出范围。使用注册表将对象转换为C++。我确信他们不是垃圾回收,直到C++代码破坏了引用Lua对象的C++对象。@直到收集到代码< > Healon点击> /Cuff>之前,不能调用@ KingCoyote <代码> Objuts2 < /Cord>。
objectTwo
位于回调的词法闭包中。您是否将
objectOne
存储在某个地方?它是脚本的局部块,如果它没有存储在其他地方,它将被GC'ED,并且C++的析构函数将清理所有其他(如果做得好),包括回调函数,所以<代码> Objuts2[/Cudio]将被清理。Objuts2和ObjutOne都被存储在注册表中,作为属于两个单独的C++对象的参考文献。回调函数引用也存储在持有对象ObjutOne的C++对象中。@ KeCooOutE C++对象位于注册表中。那么
Gui:newObject
的输入参数呢?那些带参数的表,如何处理其中的数据?回调是一个Lua对象,而不仅仅是指向某些代码的指针。它必须保存在Lua-in注册表中,或者嵌套在注册表中存储的对象拥有的表中。C++中的函数GUI:NeWObjor采用输入表并重新引用,将其存储在C++中。这个表由newObject返回到lua中。本质上,C++对象保存对传入NeWObject的表的引用,并且该函数也由函数返回。