Re[3]: Lua и Luabind
От: Detonator321  
Дата: 20.03.13 11:41
Оценка: 4 (1)
Здравствуйте, johny5, Вы писали:

тоже не совсем понял, что хочется, но попробую что-нибудь внятное ответить...

J>Попробую разложить:

J> Хочу вместо вызова luaL_dostring, что сразу запускает скрипт на выполнение, сделать сначала luaL_loadstring, куда-то закешировать скомпилированный скрипт (типа очевидная оптимизация), потом использовать этот скрипт как конструктор для моих Lua-объектов (Lua-объект это зеркало С++ объекта, для которого дополнительно будет крутиться и скрипт). К примеру в скрипте содержится:

в общем случае это будет не совсем верно, поскольку у тебя могут накапливаться состояния части объекта в lua, и по идее жизнью таких объектов должнен управлять lua. По-моему правильнее сделать так:

есть базовый C++ класс, условно Widget, с виртуальными функциями(popup_effect), пишешь для него wrapper, как указано в документации к luabind(12.1 Deriving in lua)

создаешь класс, допустим SuperWidgetWithPopupFX в lua, наследуешься от Widget, переопределяешь виртуальную функцию popup_effect в lua со своей доп. логикой, порождаешь объект lua класса на lua стороне, отдаешь его хоть в C++, вызов виртуальной функции со стороны C++ будут автоматически транслироваться на сторону lua.



J>
J>function create_popup_effect(initial_sleep_delay)
J>    return coroutine.wrap(
J>    function(dt)
J>    ...

J>function on_idle(dt)
J>    absolute_time = absolute_time + dt
J>    return angle_anim(dt)
J>end

J>angle_anim = create_popup_effect(0.5)
J>


J>т.е. скрипт создаёт короутины, которые будут крутиться для моего объекта. Важно тут что объектов может быть много и они не должны никак влиять друг на друга. Отсюда вопросы, как закешировать скрипт (в результате luaL_loadstring что получается, функция?); как запускать его так, чтобы он не гадил в глобальный неймспейс а писал только в объект. Желательно в терминах luabind.


J>-----


J>Второй вопрос (часть первого), как делают ООП в Lua? Я видел примеры с использованием luabind::call_method, но не понял как он используется, можно пояснить по этому? Взять простейший пример. Есть С++ объект, он отображается (через luabind (class_<>, .def()) описания) напрямую в Lua. Соответственно Lua часть объекта может иметь и свои переменные. Код, работающий в С++ и в Lua работают с одним объектом, и как и в ООП, этот код не влияет на другие объекты того же класса.


совсем сумбурно вопрос написал вроде-бы на первую часть ответил, по второй части все будет и так хорошо, для этого передаются this и self только опасяйся слайсинга(lubind doc — 12.4 Slicing), там всё хорошо написано.

J>Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.