- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我想在 C++ 中使用 Lua C API 做的事情。
我正在尝试找出一种使用户数据派生自基本用户数据对象的好方法。
我希望能够做到这一点:
local item = me:GetCurrentItem()
print(item:GetPos())
代替:
local item = me:GetCurrentItem()
print(item:GetBaseObject():GetPos())
在这些示例中,me:GetCurrentItem() 返回带有某些函数的用户数据,但它缺少 item:GetBaseObject() 返回的基本函数。
出于学习目的,我在 Crysis Wars SDK 中绑定(bind)了 Lua。 SDK 为作为结构的基本实体提供接口(interface)。 IItem 结构 (me:GetCurrentItem()) 是相同的。由于这些是结构,我无法将它们转换为基本结构或调用其基本函数。我必须使用 IEntity *GetEntity() 函数。
我试过改变 __index 中的自指针,但它导致局部变量“item”变成“entity”,这很明显,但我希望它在调用 GetPos 函数后恢复原状,这似乎不合逻辑。
有没有人有解决这个问题的好方法?
最佳答案
显而易见的解决方案是定义一个执行重定向的 item:GetPos() 函数。
function Item:GetPos()
return self:GetBaseObject():GetPos()
end
其中 Item 是项目的元表。
这与在元表上进行更改一样有效,而且问题较少。
编辑:我也可以帮你解决重复问题。
您可以实现以下两个功能:
function delegate(klass, methodName, memberName)
klass[methodName] = function(self, ...)
local member = self[memberName]
if type(member) == 'function' then member = self[memberName](self) end
return member[methodName](member, ...)
end
end
然后像这样使用它:
delegate(Item, 'GetPos', 'GetBaseObject')
该单行与上面的 Item:GetPos
3 行定义相同。
如果你需要多次重复这个,你可以用这个其他函数进一步优化它:
function delegateMany(klass, methodNames, memberName)
for _,methodName in ipairs(methodNames) do
delegateMethod(klass, methodName, memberName)
end
end
这应该允许你做:
deletageMany(Item, {'GetPost', 'SetPos', 'GetColor', 'SetColor'}, 'GetBaseObject')
我还没有测试过这些功能中的任何一个,所以要小心错误。他们应该同时使用“获得的属性”(self:GetSomething()
以及简单的访问 self.something
)。该代码假定您将始终使用“:”来调用委托(delegate)方法,因此在需要时添加了 self
。
关于c++ - 如何设置一个元表以从另一个元表继承,同时将用户数据更改为另一种类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6605815/
我遇到的情况是,两个库 L、M 正在尝试为 _G(分别命名为 mL、mM)设置元表。元表中唯一的东西是 __index。 我如何链接这两个元表,以便如果一个中的 __index 失败,它会调用另一个中
我正在尝试使用 Lua Metatables 为一些内部 C++ 函数创建一个更漂亮的接口(interface)。 这是我目前运行的代码。 (my.get 和my.set 是用C++实现的) func
我有这样的东西:(它实际上是 C++,但在这种简化形式中,没有任何 C++ 特定内容) struct Blob; // Some key-value accessors on Blob char *
我有一些后台 lua 代码,我在每次启动时加载它们,它们工作正常,但有什么方法可以将它们转换为 C# 吗? 这是我的元表代码: player = {} player.__index = player
也许这是非常基本的,这就是为什么我没有找到任何东西的原因...... 这是我的表结构: 对象 id | type | … 1 | brand | … 2 | project | … 3
在 3D 场景中,我有一个对象,它有一个我想使用 Lua 移动的位置。 例如。 box.position.x = 10 box 有一个元表(“Object”),因此有一个位置(“Vec”)。对象设置了
这是一个具体的例子: Wordpress 将用户信息(meta)存储在一个名为 wp_usermeta 的表中,您可以在其中获取 meta_key 字段(例如:first_name)和 meta_va
我正在使用 Lua 的 C API 在 C 中实现元表。不知道是否__newindex方法应该通过返回一个值来报告成功或失败,或者是否应该通过使用错误来处理。 似乎在__index的上下文中与 ret
我正在使用 Corona/Lua 开发一款游戏,并实现了一个名为“Item”的类,它代表游戏中的武器、盔甲、护身符等。而且我是面向对象的 Lua 新手。 创建类的新实例后,我发现设置对象的某些属性似乎
我是一名优秀的程序员,十分优秀!