Исправление Lua + SWIG Monkey

Я использовал SWIG для привязки набора классов к lua. Я знаю, что сам С++ не поддерживает исправление обезьян, и я не пытаюсь изменить свои объекты С++, а просто их представления lua. Проблема возникает, если я хочу начать исправление lua-таблиц и объектов, экспортируемых SWIG, чтобы я мог изменить API, представленный на стороне lua.

например следующий луа-код:

game.GetEnemies1 = game.GetEnemies2

не работает должным образом. Поведение после этой строки по-прежнему соответствует исходному GetEnemies1, а не GetEnemies2.

как мне бороться с этой проблемой?


person Tom J Nowell    schedule 02.05.2010    source источник


Ответы (2)


Я успешно исправил пользовательские данные lua, добавив и заменив существующие методы. Это включало изменение их метатаблиц.

Вот пример того, что мне пришлось сделать, чтобы добавьте пару методов к существующему объекту пользовательских данных.

Как видите, вместо изменения самого объекта мне пришлось изменить его метатаблицу.

Это решение будет работать только в том случае, если ваши объекты пользовательских данных настроены так, что их метатаблицы «указывают на себя»: mt.__index = mt.

С уважением!

person kikito    schedule 17.05.2010

Swig генерирует lua-оболочки из функций C++, он не внедряет lua-функции в C++. Если GetEnemies1 является функцией C++, вызываемой из других функций C++, исправление обезьяны работать не будет.

Вам придется переписать свой код C++, чтобы код, который выполняет GetEnemies1, искал какой-то обратный вызов, который вы можете обернуть с помощью swig.

person mikerobi    schedule 02.05.2010
comment
Я понимаю, что замена метода в lua с помощью исправлений обезьяны повлияет только на код lua, и что исправление обезьяны самого C++ невозможно, но это мое намерение. Есть определенные методы C++, которые я хотел бы исправить обезьяной на конце lua, чтобы сделать их лучше, или даже просто переименовать - person Tom J Nowell; 02.05.2010