使用C API在Lua中覆盖赋值运算符
我在我的C++程序中有对象,我将它们作为userdata传递给Lua,并覆盖这个userdata的元表,以便通过__newindex和__index中的索引分配到和分配出对象(通过C调用),将分配转换为影响C++对象或将C++元素转换为Lua值(另一个userdata或基本类型如bool、number、string)。这些userdata作为参数传递给从我的C++程序调用的类似事件的Lua函数。
luaL_newmetatable(L, "object");
lua_pushstring(L, "__index");
lua_pushvalue(L, -2); /* 压入元表 */
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); /* 获取val.get */
lua_settable(L, 1); /* metatable.__index = val.get */
lua_pushstring(L, "__newindex");
lua_pushstring(L, "set");
lua_gettable(L, 2); /* 获取val.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变量引用的内容,但是据我所理解,它并不会对核心对象做任何事情。
我考虑的一种解决方法是,如果他们想改变对象本身,那么需要开发人员使用一些hack方式进行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中,将采取相应措施?
顺便说一句,我的userdata是指向对象的指针,以避免复制大型对象,如果这有影响。
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

Lua 和 C/C++ 是有不同需求的不同语言。在 C/C++ 中,变量总是引用一个特定的对象。你可以更改这个对象的内容,但你永远不能让一个变量引用一个不同的对象。如果你执行
a = b;,你是将b的值复制到a中。你永远不能改变a所表达的对象。在 Lua 中,变量不会永久引用任何东西。因此,变量当前持有的对象和该对象的值之间有区别。
通过全局变量函数来实现您的乱搞,但
local变量不是真正存在的东西。它们是 Lua 栈上的位置;你不能覆盖 Lua 对它们的默认行为。处理这个问题的最佳方法是_接受_ C 和 Lua 之间的差异。用你在 Lua 中写代码的方式来编写代码。不要试图让 Lua 的代码像 C 那样工作;这是愚蠢的。它们是不同的语言,你应该接受它们的差异,而不是反对它们。
如果你想让 Lua 具备类似于
a = b的能力,那么你应该在你的类型中创建一个名为assign或其他名字的函数,它将允许你赋值给对象的值。就像如果你想将一个表中的所有元素复制到另一个表中一样,你必须编写一个函数来完成这个任务。