Sie können immer ein Markierungsfeld in der Metatabelle mit einem leichten Benutzerdatenwert speichern, der nur für Ihr Modul gilt.
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)
um das Feld _flavor der Tabelle an die Spitze des Stapels zu setzen, und my_isflavor(L,&red_flavor)
um das Feld _flavor der Tabelle am oberen Ende des Stapels zu testen.
Auf diese Weise kann das Feld _flavor nur Werte annehmen, die durch Code in dem Modul erstellt werden können, das das Symbol green_flavor im Anwendungsbereich hat, und das Aufsuchen des Feldes und das Testen seines Wertes erfordert nur einen Tabellenaufruf neben dem Abruf der Metatable selbst. Beachten Sie, dass der Wert der Variablen green_flavor keine Rolle spielt, da nur ihre Adresse tatsächlich verwendet wird.
Da mehrere verschiedene Flavor-Variablen als Sentinalwerte zur Verfügung stehen, kann das Feld _flavor zur Unterscheidung mehrerer verwandter Metatabellen verwendet werden.
Nach all dem stellt sich natürlich die Frage: "Warum machen wir das überhaupt? Schließlich könnte die Metatabelle problemlos alle Informationen enthalten, die für das entsprechende Verhalten erforderlich sind. Es kann sowohl Funktionen als auch Daten enthalten, und diese Funktionen können sowohl von C als auch von Lua abgerufen und aufgerufen werden.