簡體   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