Luabridge слабая ссылка на данные LuaRef

Рассмотрим следующий пример:

function Process()
    local Container=NewContainer()
    Container:On(EventType.Add,function()
        Container:DoSomething()
    end)
    -- Does not Garbage Collect
end

В Луабридже я храню function() как LuaRef который продлевает срок службы Container и это не будет GCed, потому что это RefCountedObjectPtr

Вот обходной путь, который я использую, чтобы использовать слабую таблицу, которая работает, но выглядит уродливо:

function Process()
    local Container=NewContainer()
    local ParamsTable={ Container=Container }
    setmetatable(ParamsTable, { __mode = 'k' })

    Container:On(EventType.Add,function()
        ParamsTable.Container:DoSomething()
    end)
    -- Garbage Collects fine
end

Есть ли способ иметь LuaRef что функции похожи на это? Или, может быть, есть другой обходной путь?

1 ответ

Решение

Вот как я подошел к этой проблеме:

  1. Создайте класс-оболочку вокруг класса C++ luabridge (если у вас есть class Display.A() в C++ создайте класс A() в Луа)
  2. Храните слабую таблицу внутри этого класса-обёртки (self.WeakTable={} а также setmetatable(self.WeakTable, { __mode = 'k' }))
  3. В слабой таблице ссылка на себя:(self.WeakTable.self=self)
  4. Проходить self.WeakTable в C++ и хранить в виде LuaRef - это будет gc
  5. Создайте функцию-обёртку так:

    Container:On(EventType.Add,function(WeakTableParams) 
       WeakTableParams.self.Callback();
    end)
    
Другие вопросы по тегам