您可以随时在metatable中存储标记字段,并为您的模块指定唯一的light userdata值。
static const char *green_flavor = "green";
...
void my_setflavor(lua_State *L, void *flavor) {
lua_pushlightuserdata(L,flavor);
lua_pushlstring(L,"_flavor");
lua_rawset(L,-3);
}
void my_isflavor(lua_State *L, void *flavor) {
void *p = NULL;
lua_pushlstring(L,"_flavor");
lua_rawget(L,-2);
p = lua_touserdata(L,-1);
lua_pop(L,1);
return p == flavor;
}
然后你可以使用my_setflavor(L,&green_flavor)
设置表的_flavor场在堆栈的顶部,my_isflavor(L,&red_flavor)
在堆栈的顶部,以测试表的_flavor领域。
使用这种方式,_flavor场仅承担,可以通过代码,在范围内的符号green_flavor模块中创建,并查找领域和测试它的值值仅需要一个查找表除了检索的metatable本身。请注意,变量green_flavor的值并不重要,因为实际上只使用其地址。
有几个不同的风味变量可用作sentinal值,_flavor字段可用于区分几个相关的metatables。
所有这一切说,一个自然的问题是“为什么要这样做?”毕竟,metatable可以很容易地包含获得适当行为所需的所有信息。它可以容易地保存函数和数据,这些函数可以从C和Lua中检索和调用。
看来,LUA 5.2已经得到了你正在寻找:[luaL_testudata(http://www.lua.org/source/5.2/lauxlib.c.html#luaL_testudata) – 2014-02-13 10:10:05