Я нашел 2 типа кода для реализации метатабельных функций. Я не очень понимаю первое, и в чем разница со вторым.
Первый:
lua_newtable(l);
int methods = lua_gettop(l);
luaL_newmetatable(l, "MapCreator");
int metatable = lua_gettop(l);
lua_pushvalue(l, methods);
lua_setglobal(l, "MapCreator");
lua_pushvalue(l, methods);
l_set(l, metatable, "__metatable");
//set metatable __index
lua_pushvalue(l, methods);
l_set(l, metatable, "__index");
//set metatable __gc
lua_pushcfunction(l, l_destructor);
l_set(l, metatable, "__gc");
//set method table
lua_newtable(l); // mt for method table
lua_pushcfunction(l, l_constructor);
lua_pushvalue(l, -1); // dup new_T function
l_set(l, methods, "new"); // add new_T to method table
l_set(l, -3, "__call"); // mt.__call = new_T
lua_setmetatable(l, methods);
// set methods metatable
lua_pushstring(l, "rotate_selected_object"); //lua_pushstring(l, "say");
lua_pushcclosure(l, mapCreator->RotateSelectedObject,1); /// l_proxy, 1);
lua_settable(l, methods);
Второе (более понятное):
luaL_newmetatable(global_L, "GameObject");
lua_pushstring(global_L, "_index");
lua_pushvalue(global_L, -2);
lua_settable(global_L, -3);
Они не выполняют ту же работу, но это проблема одностороннего программирования.
Задача ещё не решена.