2010-05-02 4 views
1

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

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

game.GetEnemies1 = game.GetEnemies2 

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

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

ответ

1

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

Here's a sample что я должен был сделать, чтобы добавить пару методов к существующему объекту userdata.

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

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

С уважением!

0

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

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

+0

Я понимаю, что замена метода в lua с использованием патчей обезьян будет влиять только на код lua, и что обезьяна-патч C++ сама по себе невозможна, но это мое намерение. Есть определенные методы C++ Id, как для патча обезьяны на конце Lua, чтобы сделать их более приятными или даже просто переименовать –