C# LuaInterface 类运算符
2013-8-8 21:53:57
收藏:0
阅读:128
评论:1
我在C#中使用LuaInterface,并将一些自定义的C#类“导出”以供Lua使用。例如:
local myVector = Vector2(10, 100)
但是,当我想要使用类运算符时,例如在此示例中:
local v1 = Vector2(1, 1)
local v2 = Vector2(2, 2)
local v3 = v1 + v2
我会得到以下错误:尝试在本地“p1”(用户数据值)上执行算术运算
C#版本的类确实具有+运算符:
public static cVector2 operator +(cVector2 vector1, cVector2 vector2)
{
return new cVector2(vector1.X + vector2.X, vector1.Y + vector2.Y);
}
我知道您应该使用Lua元表,并为*运算符添加一个函数,例如“__mul”。但是,LuaInterface会自动执行此操作吗?如果没有,我该如何自动化此过程?
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
不行。您可以通过以下方式看到:
for k,v in pairs(getmetatable(v1)) do print(k,v) end您会发现没有
__add这个元方法。您需要修改 LuaInterface 的源代码,寻找
operator+方法并添加__add元方法。目前它还没有做到这一点。鉴于您已经可以访问类型代理(因为您通过
import_type导入了类型),故您可以访问 operator+,它是类型的静态方法。local v3 = Vector2.op_Addition(v1,v2)要使用
v1 + v2,您需要修改 Vector2 对象实例使用的元方法,但这需要创建该类型的实例:local v1 = Vector2(1,1) getmetatable(v1).__add = function(a,b) return Vector2.op_Addition(a,b) end这会影响所有实例使用的元方法,因此您只需要进行一次操作即可。现在您可以编写:
local v2 = Vector2(2,2) local v3 = v1 + v2因为您需要修改对象的元方法,所以使代码更简洁可能有些难。如果您修改 C# 代码以确保您的类具有默认构造函数(即没有参数),则可以创建一个包装器来完成
import_type:function luanet.import_type_ex(typename) local T = luanet.import_type(typename) local mt = getmetatable(T()) local function gethandler(name) return T[name] end local function addmethod(metamethodName, handlerName) local foundHandler, handler = pcall(gethandler, handlerName) if foundHandler then mt[metamethodName] = handler end end addmethod('__add', 'op_Addition') addmethod('__sub', 'op_Subtraction') addmethod('__mul', 'op_Multiply') addmethod('__div', 'op_Division') return T end您可以将其扩展为其他运算符。请注意,LuaInterface 如果尝试访问不存在的成员会抛出异常(而不是返回
nil),因此我们必须使用pcall包装访问处理程序的尝试。有了这个,您可以编写:
Vector2 = luanet.import_type_ex('YourNamespace.Vector2') local v1 = Vector2(10) local v2 = Vector2(20) local v3 = v1 + v2当然,这也适用于具有重载运算符的其他类型。
LuaInterface 有些混乱。在 Lua 的世界中,有一些类似它的项目,其中 PUC-Rio 的某些人将其作为研究项目做,发布论文,然后放弃了。他们那样做是为了看看自己是否能做到,而不是因为他们真的会用到它。