Zawsze można zapisać pole znacznika w metatabelku z lekką wartością userdata unikalną dla twojego modułu.
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;
}
Następnie można użyć my_setflavor(L,&green_flavor)
aby ustawić pole _flavor tabeli na górze stosu i my_isflavor(L,&red_flavor)
przetestować pole _flavor tabeli na górze stosu.
Użyte w ten sposób pole _flavor może przyjmować tylko wartości, które mogą być utworzone przez kod w module, który ma znak green_flavor w zakresie, a wyszukanie pola i przetestowanie jego wartości wymaga tylko jednego wyszukiwania tabeli poza pobieraniem samego metatable. Zauważ, że wartość zmiennej green_flavour nie ma znaczenia, ponieważ tylko jej adres jest faktycznie używany.
Z kilkoma różnymi zmiennymi smakowymi dostępnymi do wykorzystania jako wartości sentencji, pole _flavor może być użyte do rozróżnienia kilku powiązanych metatabli.
Wszystko to powiedziawszy, naturalnym pytaniem jest "po co w ogóle to robić?" W końcu metatable może łatwo zawierać wszystkie informacje potrzebne do uzyskania odpowiedniego zachowania. Może on łatwo przechwytywać funkcje, jak również dane, a funkcje te mogą być wywoływane i wywoływane z C, jak również z Lua.
Wygląda na to, że lua 5.2 ma to, czego szukasz: [luaL_testudata] (http://www.lua.org/source/5.2/lauxlib.c.html#luaL_testudata) –