我使用 SWIG 将一组类绑定到 lua。我知道 C++ 本身不支持猴子补丁,我也不想修改我的 C++ 对象,只是修改它们的 lua 表示。如果我想开始修补 SWIG 导出的 lua 表和对象,那么问题就来了,这样我就可以修改 lua 端提供的 API。
例如以下 lua 代码:
game.GetEnemies1 = game.GetEnemies2
没有按预期工作。该行之后的行为仍然与原始 GetEnemies1 而不是 GetEnemies2 一致。
我该如何解决这个问题?
我使用 SWIG 将一组类绑定到 lua。我知道 C++ 本身不支持猴子补丁,我也不想修改我的 C++ 对象,只是修改它们的 lua 表示。如果我想开始修补 SWIG 导出的 lua 表和对象,那么问题就来了,这样我就可以修改 lua 端提供的 API。
例如以下 lua 代码:
game.GetEnemies1 = game.GetEnemies2
没有按预期工作。该行之后的行为仍然与原始 GetEnemies1 而不是 GetEnemies2 一致。
我该如何解决这个问题?
我已经通过添加和替换现有方法成功地修补了 lua 用户数据。它涉及修改他们的元表。
下面是我为了向现有的 userdata 对象添加几个方法而必须做的一个示例。
如您所见,我不得不修改它的元表,而不是修改对象本身。
此解决方案仅在您的 userdata 对象设置为使其元表“指向自己”时才有效:mt.__index = mt
。
问候!
Swig 从 c++ 函数生成 lua 包装器,它不会将 lua 函数注入 c++。如果 GetEnemies1 是从其他 c++ 函数调用的 c++ 函数,则猴子修补将不起作用。
您将不得不重写您的 c++ 代码,以便执行 GetEnemies1 的代码寻找某种可以用 swig 包装的回调。