Вы всегда можете сохранить поле маркера в метатете, имеющее легкое значение 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 в области видимости, и поиск по полю и проверка его значения потребовали только одного поиска таблицы, кроме поиска самого метатетируемого. Обратите внимание, что значение переменной green_flavor не имеет значения, так как фактически используется только его адрес.
С несколькими различными переменными вкуса, доступными для использования в качестве отпущенных значений, поле _flavor можно использовать для выделения нескольких связанных метатегов.
Все, что сказал, естественный вопрос: «зачем вообще это делать?» В конце концов, metatable может легко содержать всю информацию, необходимую ему для получения соответствующего поведения. Он может легко хранить функции, а также данные, и эти функции могут быть восстановлены и вызваны с C, а также с Lua.
Кажется, что у lua 5.2 есть то, что вы ищете: [luaL_testudata] (http://www.lua.org/source/5.2/lauxlib.c.html#luaL_testudata) –