我已经创建了一个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
类型吗?