[英]What is the difference between Lua registry with light userdata and references?
[英]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.