В метатаблице всегда можно сохранить поле маркера со светлым значением пользовательских данных, уникальным для вашего модуля.
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 можно использовать для различения нескольких связанных метатаблиц.
Все это говорит, естественный вопрос: "Зачем вообще это делать?" В конце концов, метатабель может легко содержать всю информацию, необходимую для получения соответствующего поведения. Он может легко содержать функции, а также данные, и эти функции могут быть извлечены и вызваны из C, а также Lua.