如何通过Lua的C API将方法注入对象中

我有一个userdata对象,我已经创建了它。我定义这个对象的方式如下:

static const luaL_Reg object_methods[] = {
    {"__gc",       pbject_gc},
    {"__tostring", object_print},
    { NULL, NULL }
};

static int
object_new (lua_State *L)
{
    Object *Object = lua_newuserdata(L, sizeof(Object));
    luaL_getmetatable(L, "Object");
    lua_setmetatable(L, -2);
    return 1;
}

int
luaopen_Object (lua_State *L)
{
    /* create metatable */
    luaL_newmetatable(L, "Object");

    /* metatable.__index = metatable */
    lua_pushvalue(L, -1);
    lua_setfield(L, -1, "__index");

    /* register methods */
    luaL_setfuncs(L, object_methods, 0);

    /* Push a function: Object(...) => new Object */
    lua_pushcfunction(L, object_new);

    return 1;
}

我想要创建一个不同的object_new,称为object_s_new,为“特殊new”。在object_s_new中,如何向对象的metatable中注入方法?

我的尝试仅仅调用luaL_getmetatable并编辑该表格,但是,正如我所预期的那样,那会编辑所有使用它的对象的metatable。我希望注入的方法仅局限于由object_s_new创建的对象。

有没有办法在不创建完全不同的metatable的情况下做到这一点?这会以任何奇怪的方式影响Lua的identity吗?例如,我是否可以将一个struct Script作为两种不同的userdata类型?

点赞