Siempre puede almacenar un campo de marcador en la metatabla con un valor de usuario ligero que sea exclusivo de su módulo.
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;
}
continuación, puede utilizar my_setflavor(L,&green_flavor)
para establecer el campo _flavor de la tabla en la parte superior de la pila, y my_isflavor(L,&red_flavor)
para probar el campo _flavor de la tabla en la parte superior de la pila.
Utilizado de esta manera, el campo _flavor solo puede tomar valores que pueden crearse por código en el módulo que tiene el símbolo green_flavor en el alcance, y buscar el campo y probar su valor solo requiere una búsqueda de tablas además de la recuperación del metatabla en sí. Tenga en cuenta que el valor de la variable green_flavor no importa, ya que solo se usa su dirección.
Con varias variables de sabor distintas disponibles para usar como valores de sentido, el campo _flavor se puede usar para distinguir varias metatatas relacionadas.
Dicho todo esto, una pregunta natural es "¿por qué hacer esto en absoluto?" Después de todo, el metatable podría contener fácilmente toda la información que necesita para obtener el comportamiento apropiado. Puede contener fácilmente funciones y datos, y esas funciones se pueden recuperar y llamar desde C y Lua.
Parece que lua 5.2 tiene lo que estás buscando: [luaL_testudata] (http://www.lua.org/source/5.2/lauxlib.c.html#luaL_testudata) –