Ссылка на таблицу / объект lua после запуска скрипта - PullRequest
1 голос
/ 12 октября 2019

Я проектирую систему с графическим интерфейсом на Lua, связанную с C ++. Я не буду вдаваться в ненужные подробности, но, по сути, скрипт lua, который создает форму, выглядит примерно так:

local objectTwo = Gui:newObject{
    position = {10,10},
    size = {100,100},
}

local objectOne = Gui:newObject{
    position = {10,10},
    size = {100,100},
    handleOnClick = function(x, y, button)
        objectTwo:setProperties{
            hidden = false
        }
    end
}

По существу newObject передает таблицу в C ++, а handleOnClick превращается в пользовательский класс функций C ++. Когда по этому объекту щелкают, он вызывает этот класс функций и оценивается в Lua.

Однако objectTwo больше не существует в Lua, так как скрипт выполняется, поэтому он пытается вызвать setProperties для nil и вылетает.

Мой вопрос: как я могу гарантировать, что на objectTwo все еще можно ссылаться в handleOnClick? Я бы предпочел не помещать его в глобальный реестр или что-то подобное, чтобы не загрязнять пространство имен.

Могу ли я что-то сделать с закрытием?

1 Ответ

0 голосов
/ 12 октября 2019

Когда создается objectOne, переменная local objectTwo еще не находится в области, поэтому Lua предполагает чтение из глобальной переменной objectTwo, которая никогда не определяется, поэтому возвращает nil при чтении.

Как минимум переместите объявление local objectTwo перед кодом, который будет ссылаться на него. Вы не должны определять объект прямо здесь, назначение может быть выполнено позже. Но объявление переменной должно предшествовать коду, который хочет получить к нему доступ.

Также обратите внимание на владение данными / кодом. Вы сказали, что «конвертируете его в пользовательский класс C ++» без дополнительных подробностей. Вы должны знать, что вы должны где-то хранить значение Lua для функции обратного вызова. Будь то реестр или какая-то принадлежащая классу таблица, но все еще хранящаяся где-то, доступной для Lua, поэтому функция обратного вызова не будет собираться мусором через некоторое время.

...