Sie könnten ein Markierungsfeld in der Metatabelle immer mit einem leichten Benutzerdatenwert speichern, der für Ihr Modul eindeutig ist.
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;
}
Dann können Sie my_setflavor(L,&green_flavor)
verwenden, um das _flavor Feld der Tabelle ganz oben auf dem Stapel zu setzen und my_isflavor(L,&red_flavor)
an der Spitze des Stapels das _flavor Feld der Tabelle zu testen. Auf diese Weise kann das _flavor-Feld nur Werte annehmen, die durch Code in dem Modul mit dem Symbol green_flavor im Gültigkeitsbereich erzeugt werden können, und das Nachschlagen des Feldes und das Testen seines Werts erforderte nur eine Tabellensuche neben dem Abruf der Metatable selbst. Beachten Sie, dass der Wert der Variablen green_flavor keine Rolle spielt, da nur seine Adresse tatsächlich verwendet wird.
Da mehrere verschiedene Flavor-Variablen zur Verwendung als Sentinal-Werte zur Verfügung stehen, kann das Feld _flavor zur Unterscheidung mehrerer verwandter Metatabellen verwendet werden.
Alles gesagt, eine natürliche Frage ist "warum überhaupt?" Schließlich kann das Metatable leicht alle Informationen enthalten, die es benötigt, um das richtige Verhalten zu erzielen. Es kann sowohl Funktionen als auch Daten bereithalten, und diese Funktionen können sowohl von C als auch von Lua abgerufen und aufgerufen werden.
Es scheint, dass lua 5.2 hat, was Sie suchen: [luaL_testudata] (http://www.lua.org/source/5.2/lauxlib.c.html#luaL_testudata) –