我在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
附加功能:
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)之后调用__gc元方法(t2对象)。)
简单的方法是使用表:
function foo()
ret = {}
ret[1] = test()
ret[2] = test()
ret[1]:attach(ret[2])
return ret
end
但这不是有趣的方式。 谢谢!
答案 0 :(得分:0)
过去我遇到过同样的问题。原因很简单,Lua不知道C代码中建立的连接(现在没有,但我想它会在某处完成)。
您不必执行表方法,只需将Lua端的两个对象/表/链接起来:
function foo()
local t1 = test()
local t2 = test()
t1:attach(t2)
t1._dummy_link = t2
return t1
end
请记住,这只适用于1:1的关系。对于更复杂的东西,你仍然需要使用某种表或类似的方法。可能最干净的方法是在Lua端进行链接,只是添加回调到C,以防有C代码运行。
答案 1 :(得分:0)
您可以在Lua注册表中进行设置。这实际上是一个只能在C代码中访问的全局表。您可以设置registry[t1] = t2;
。只要您在t1
的{{1}}中正确设置此项。这也可以扩展为__gc
映射,例如,1:n
可用于多个“子”。