Lua 对象之间的引用。
2012-6-30 7:8:28
收藏:0
阅读:147
评论:2
我在 C 中实现了 Simple Lua 类。类的用法:
require("test")
function foo()
local t1 = test()
local t2 = test()
t1:attach(t2)
return t1
end
o = foo()
-- some code
o = nil
attach 函数:
int class_attach(lua_State *L)
{
module_data_t *mod = luaL_checkudata(L, 1, "test");
luaL_checktype(L, 2, LUA_TUSERDATA);
module_data_t *child = lua_touserdata(L, 2);
printf("%p->%p\n", (void *)mod, (void *)child);
return 0;
}
从函数返回后,t2 对象将通过 GC 清除。是否可能防止这种情况发生,设置 t1 和 t2 对象之间的引用关系?(只有在父模块(t1)清除后才调用 t2 对象的 __gc 元方法)。
简单的方法是使用表格:
function foo()
ret = {}
ret[1] = test()
ret[2] = test()
ret[1]:attach(ret[2])
return ret
end
但那并不是有趣的方法。 谢谢!
点赞
用户298661
你可以在 Lua 的注册表中设置它。这实际上是一个全局表,只能在 C 代码中访问。您可以设置 registry[t1] = t2;。只要您恰当地在 t1 的 __gc 中取消设置,就可以了。这也可以适用于 1:n 映射,例如,您可以为多个“子项”执行 registry[t1].insert(t2)。
2012-06-30 08:12:33
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的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 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
我以前也遇到过同样的问题。简单的原因是 Lua 不知道在 C 代码中建立的连接(目前没有,但我猜以后会在某处完成)。
你不必采用表格的方法,只需在 Lua 端将两个对象/表/等等链接起来即可:
function foo() local t1 = test() local t2 = test() t1:attach(t2) t1._dummy_link = t2 return t1 end只需记住,这仅适用于一对一的关系。对于更复杂的内容,您仍然需要使用某种类型的表格或类似方法。最干净的方法可能是在 Lua 端进行链接,并在需要运行 C 代码时添加一个回调到 C 中。