也许我在Google搜索方面表现不佳,也许我会过度思考问题,但如果我有这个Lua课程:
--Foo:
Foo = {number = 0}
function Foo.setNumber(newNumber)
number = newNumber
end
如果我尝试在另一个.lua文件中使用此类,则在文件结束后,该对象将被销毁。我使用Lua(like here)看到的其他教程假设C ++程序已经知道了类,因此它被定义为普通的C ++类。然而,就我而言,Lua的观点是C ++程序只是一个处理绘图等的框架,因此不能将Lua类硬编码到程序中。
所以,我的问题是,如何使用Lua定义和保存Lua对象,但除非我明确告诉它,否则对象不会被破坏?我正在考虑用C ++创建一个存储Lua对象的向量/映射的类,然后Lua脚本可以使用公开的函数请求对象。不幸的是,听起来很慢,因为Lua要执行一个函数,它需要从C ++接收类的副本,调用类的函数,然后将其发送回C ++,以覆盖前一个副本。
以下是一些代码,这些代码是根据Elias Daler's教程修改的,我们是如何运行Lua脚本的(这是非常好的IMO):
#include <lua.hpp>
#include <LuaBridge.h>
#include <string>
//Example class to expose (I realise it's very similar to Foo):
class Bar
{
private:
std::string string;
public:
void setString(const std::string& newString) {string = newString;}
}
int main()
{
//Expose the API:
lua_State* L = luaL_newstate();
luaL_openlibs(L);
luabridge::getGlobalNamespace(L)
.beginClass<Bar>("Bar")
.addConstructor<void(*)(void)>()
.addFunction("setString", &Foo::setString)
.endClass();
//Run the script:
luaL_dofile(L, "script.lua");
luaL_openlibs(L);
lua_pcall(L, 0, 0, 0);
return 0;
}
答案 0 :(得分:2)
在Lua中,所有全局变量都存储在全局表 _G (称为environment)中。除非有人明确地修改它,否则只有在Lua state被销毁时才会销毁它。
因此,您可以使用以下命令运行第二个脚本:
luaL_dofile(L, "another_script.lua");
它应该看到第一个脚本留下的全局变量,因为脚本使用与第一个脚本相同的Lua状态。
答案 1 :(得分:1)
Lua通过垃圾收集管理自己的生命周期。如果它看不到使用的对象,它将破坏它。诀窍是将这些对象存储在lua表中,c ++添加并删除它们,控制它们的生命周期。