如何使用Lua的C api将方法注入到对象中

时间:2015-10-05 14:34:10

标签: c object lua lua-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代表'特别新'。在object_s_new中,如何将方法注入对象metatable?

我尝试过调用luaL_getmetatable并编辑该表,但是,正如我所料,它编辑了使用它的所有对象的元表。我希望注入的方法只对object_s_new创建的对象是本地的。

在没有创建完全独立的元表的情况下,有没有这样做?这是否会以任何奇怪的方式影响Lua的身份?例如,我可以将一个struct Script作为两种不同的userdata类型吗?

0 个答案:

没有答案