Lua嵌入C++,如何处理用户值

我正在将Lua嵌入C++应用程序中,并希望将Lua表与C指针关联。

在对象构造函数中,我有以下代码:

Thing (const std::string name_, lua_State * L): name(name_)
    {
        std::string filename = name + ".lua";

        luaL_dofile(L, filename.c_str());

        lua_pushlightuserdata(L, this);

        lua_newtable(L);
        lua_setuservalue(L, 1); // 将Lua表与userdata关联。

        luaL_getmetatable(L, "Metatable.Thing");

        lua_setmetatable(L, 1);

    }

在"Metatable.Thing"元表的__newindex元方法中,我有以下代码:

static int ThingNewIndex(lua_State * L)
    {
        assert(lua_isuserdata(L, 1));
        assert(lua_isstring(L, 2));

        Thing * thing = (Thing *)lua_touserdata(L, 1);
        const char * index = lua_tostring(L, 2);

        lua_getuservalue(L, 1);

        assert(lua_istable(L, -1)); // 此断言失败。

        lua_pushvalue(L, 2);
        lua_pushvalue(L, 3);
        lua_settable(L, -3);

        return 0;

    }

lua_getuservalue函数不会在堆栈上放置任何表。

我是否误解了用户值的工作原理?是否有另一种方法将C++指针与Lua表关联起来?

点赞