Обратный вызов функции-члена Lua

У меня есть lua "переменная анимации", которая имеет функцию обратного вызова, используемую в цикле анимации.

local av = AnimationVariable(ticker.Position.Y)
...
av:addCallback( ** animation function goes here **)

Пропустив подробности, эта функция addCallback определена в C++ следующим образом:

void LuaUIAnimationVariable::addCallback(luabind::object callback);

а при обновлении переменной анимации callback выполняется как таковой (мы вызываем функцию с одним аргументом):

luabind::call_function<void>(boost::ref(callback), newValue);

У меня следующий вопрос: Как я могу использовать функцию-член с addCallback? Предполагая, что у меня есть функция Ticker:animate(ypos), использование addCallback для экземпляра Ticker addCallBack(ticker:animate) не компилируется, а addCallBack(ticker.animate) не работает. Я понимаю, что функции-члены в lua имеют неявный первый параметр «я».

Любое решение или я вынужден использовать глобальную функцию?


person num3ric    schedule 17.07.2012    source источник


Ответы (1)


Не уверен, что понимаю ваш вопрос, но если вы имеете в виду функцию-член Lua, вы можете использовать закрытие:

av:addCallback(function(yval) ticker:animate(yval) end)
person Seth Carnegie    schedule 17.07.2012
comment
Это предполагает, что тикер является глобальным, не так ли? Проблема в том, что addCallback находится внутри цикла for, который проходит через все мои тикеры. - person num3ric; 18.07.2012
comment
Это только предполагает, что ticker находится в пределах области действия; на что бы ни ссылался ticker во время создания закрытия, это то, на что оно будет ссылаться всякий раз, когда вы его вызываете. - person furq; 18.07.2012
comment
@ num3ric, вот почему они называют это закрытием. Он фиксирует переменную в момент ее создания и остается незатронутым, если вы присваиваете значение переменной вне замыкания. - person Seth Carnegie; 18.07.2012
comment
@furq: на что бы ни ссылался тикер во время создания закрытия, это то, на что он будет ссылаться всякий раз, когда вы его вызываете. Это только верно, если это локальная переменная. Если ticker является глобальным, то он будет пытаться получить доступ к глобальной переменной каждый раз, когда вызывается функция. Замыкания Lua закрываются только над локальными переменными. - person Nicol Bolas; 18.07.2012