在C++程序中存储Lua对象,并在Lua中创建和访问该对象。

也许我不擅长使用 Google 进行搜索,也许我试图过度思考问题,但如果我有这个 Lua 类:

- Foo:
Foo = {number = 0}
function Foo.setNumber(newNumber)
    number = newNumber
end

如果我试图在另一个 .lua 文件中使用这个类,文件结束后,对象就会被销毁。我看到的其他使用 Lua 的教程(比如这里)假设 C++ 程序已经知道了这个类,因此它被定义为普通的 C++ 类。然而,在我的情况下,Lua 的目的是让 C++ 程序只是一个处理绘图等框架,因此不能有硬编码到程序中的 Lua 类。

因此,我的问题是,如何使用 Lua 定义和保留 Lua 对象,除非我明确告诉它删除,否则它不会被销毁?我考虑创建一个在 C++ 中存储 Lua 对象向量/映射的类,然后 Lua 脚本可以使用暴露的函数请求对象。不幸的是,这听起来非常慢,因为要让 Lua 执行一个函数,它需要从 C++ 中接收一个类的副本,调用类的函数,然后将其发送回 C++,以便覆盖以前的副本。

这里是一些从 Elias Daler's 关于我如何运行 Lua 脚本的教程中修改的代码(据我所知,这些教程非常好):

#include <lua.hpp>
#include <LuaBridge.h>

#include <string>

//要公开的示例类(我意识到这与 Foo 非常相似):
class Bar
{
    private:
        std::string string;

    public:
        void setString(const std::string& newString) {string = newString;}
}

int main()
{
    //公开 API:
    lua_State* L = luaL_newstate();
    luaL_openlibs(L);
    luabridge::getGlobalNamespace(L)
    .beginClass<Bar>("Bar")
        .addConstructor<void(*)(void)>()
        .addFunction("setString", &Foo::setString)
    .endClass();

    //运行脚本:
    luaL_dofile(L, "script.lua");
    luaL_openlibs(L);
    lua_pcall(L, 0, 0, 0);
    return 0;
}
点赞
用户5129715
用户5129715

Lua通过垃圾回收来管理自己的生命周期。如果它不能看到对象正在使用,它将销毁它。技巧在于将这些对象存储在一个Lua表中,由C++添加和删除它们,控制它们的生命周期。

Lua manages its own lifetimes through garbage collection. If it can't see an object is used, it will destroy it. The trick is to store these objects in a lua table, with the c++ adding and removing them, controlling their life time.
2015-07-19 08:56:51
用户556899
用户556899

在 Lua 中,所有全局变量都存储在全局表 _G 中(称为环境)。除非有人明确修改它,否则只有在销毁 Lua 状态时才会被摧毁。

因此,您可以使用以下命令运行第二个脚本:

luaL_dofile(L,"another_script.lua");

它应该能够看到第一个脚本留下的全局变量,因为该脚本使用与第一个脚本相同的 Lua 状态。

2015-07-19 09:22:10