您可以隨時在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