我的 C++ 程序中有对象作为用户数据传递给 Lua,我重写了此用户数据的元表,以便对对象索引的分配(通过 __newindex 和 __index)导致对 C 的调用,它转换分配影响 C++ 对象或将 C++ 元素转换为 Lua 值(另一个用户数据或基本类型,如 bool、number、string)。用户数据作为参数传递给从我的 C++ 程序调用的类似事件的 Lua 函数。
luaL_newmetatable(L, "object");
lua_pushstring(L, "__index");
lua_pushvalue(L, -2); /* pushes the metatable */
lua_settable(L, -3); /* metatable.__index = metatable */
luaL_openlib(L, NULL, vallib_m, 0);
luaL_openlib(L, "internal", vallib_f, 0);
lua_pushstring(L, "__index");
lua_pushstring(L, "get");
lua_gettable(L, 2); /* get val.get */
lua_settable(L, 1); /* metatable.__index = val.get */
lua_pushstring(L, "__newindex");
lua_pushstring(L, "set");
lua_gettable(L, 2); /* get array.set */
lua_settable(L, 1); /* metatable.__newindex = val.set */
但是,这不允许我分配实际变量本身,只能分配变量的索引。没有直接覆盖赋值运算符的元事件,所以我正在寻找一种解决方法。
换句话说,我可以这样做:lua_userdata_object_passed_as_arg_to_event["is_it_true"]=true
它会将 Lua 布尔值分配给我的内部 C++ 对象,但如果我这样做:
lua_userdata_object_passed_as_arg_to_event = new_object()
它将更改 Lua 变量引用的内容,但它不会对核心对象做任何事情,据我所知它。
我考虑过的一种解决方法是,lua_userdata_object_passed_as_arg_to_event["__self"] = new_object()
如果开发人员想要更改对象本身,需要进行一些破解,但这是不可取的。
因此,我找到了一些独特的解决方案来通过使用全局变量和覆盖全局元表赋值运算符来覆盖赋值运算符,但我正在寻找是否有人可以帮助我解释这个解决方案。见http://lua-users.org/lists/lua-l/2012-01/msg00413.html和https://www.lua.org/pil/14.2.html。特别是,我的变量是函数参数,而不是全局变量,那么如何通过 C API 转换为全局变量,以便自定义 C 函数捕获任何分配,如果分配发生在全局用户数据上,该函数将采取行动?
顺便说一句,我的 userdata 是一个指向对象的指针,以避免复制大对象,如果这很重要的话。