Lua在对象之间引用

时间:2012-06-30 07:08:28

标签: c oop garbage-collection lua

我在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

但这不是有趣的方式。 谢谢!

2 个答案:

答案 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可用于多个“子”。