繁体   English   中英

对象之间的Lua引用

[英]Lua references between objects

我在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)之后才调用(t2对象的)__ gc元方法)。

简单的方法是使用表:

function foo()
    ret = {}
    ret[1] = test()
    ret[2] = test()
    ret[1]:attach(ret[2])
    return ret
end

但这不是好玩的方式。 谢谢!

我过去也遇到过同样的问题。 这样做的简单原因是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添加回调。

您可以在Lua注册表中进行设置。 这实际上是一个全局表,只能用C代码访问。 您可以设置registry[t1] = t2; 只要您在t1__gc适当地取消此设置即可。 这也可以缩放为1:n映射,例如您可以对多个“子代”进行registry[t1].insert(t2)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM