Lua 和 C++ 绑定 - 这行代码是什么意思?

以下代码是将一个C++类绑定到Lua。

void registerPerson(lua_State *lua, Person *person)
{
    //假设person是一个有效的指针
    Person **pptr = (Person**)lua_newuserdata(lua, sizeof(Person*));
    *pptr = person;//将指针存储在userdata中。您必须注意确保指针在Lua访问期间始终有效。

    if (luaL_newmetatable(lua, "PersonMetaTable")) // 这很重要。由于可能会多次调用它,所以您应该检查表格是新创建的还是已经存在
    {
        //表格是新创建的,所以我们注册它的函数
        lua_pushvalue(lua, -1);
        lua_setfield(lua, -2, "__index");

        luaL_Reg personFunctions[] = {
            "getAge", lua_Person_getAge,
            nullptr, nullptr
        };
        luaL_register(lua, 0, personFunctions);
    }

    lua_setmetatable(lua, -2);
}

上述代码来自于这个问题的答案,它将一个C++类(Person)绑定到Lua。如您所见,该函数

  • 创建一个新的userdata并将其推入堆栈的顶部。将person指针存储在userdata中。
  • 使用luaL_newmetatable创建一个名称为“PersonMetaTable”的元表,此时元表应该位于堆栈的顶部。

根据文档,函数lua_pushvalue将给定索引处的元素复制到堆栈的顶部。但是,在这里使用了参数-1调用该函数,我认为它会复制元表(因为它在堆栈的顶部),这种看法正确吗?

为什么需要复制元表?这一行代码的目的是什么?

lua_pushvalue(lua, -1);
点赞
用户646619
用户646619

开始:[Person*,metatable] lua_pushvalue复制元表引用并将其推入栈中,因此需要将分配的值从栈中弹出,以便在设置__index表时不会丢失。

`lua_pushvalue`: [Person*, metatable, metatable] <- 元表被复制并推送到栈上
`lua_setfield`: [Person*, metatable] <- 元表副本被弹出。 metatable.__index = metatable
`lua_setmetatable`: [Person*] <- 元表被弹出。 getmetatable(Person*) = metatable
2015-03-08 16:52:43