gpt4 book ai didi

C# LuaInterface 类运算符

转载 作者:太空宇宙 更新时间:2023-11-03 10:59:47 25 4
gpt4 key购买 nike

我在 C# 中使用 LuaInterface,并且我“导出”了一些要在 Lua 中使用的自定义 C# 类。例如:

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 不会自动这样做吗?如果没有,我该如何自己实现自动化?

最佳答案

But doesn't LuaInterface does that automatically?

没有。您可以通过以下方式亲自查看:

for k,v in pairs(getmetatable(v1)) do
print(k,v)
end

你不会看到 __add元方法。

if not, how could I automate this myself?

您必须修改 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

您可以将其扩展到其他运算符。请注意,如果您尝试访问不存在的成员(而不是返回 nil ),LuaInterface 会抛出异常,因此我们必须使用 pcall 包装访问处理程序的尝试。 .

有了它你可以写:

Vector2 = luanet.import_type_ex('YourNamespace.Vector2')
local v1 = Vector2(10)
local v2 = Vector2(20)
local v3 = v1 + v2

当然,这适用于具有重载运算符的其他类型。

LuaInterface 有点乱。在 Lua 世界中有一些类似的项目,PUC-Rio 的某人将其作为研究项目,publishes a paper ,然后放弃它。他们这样做是为了看看是否可以,而不是因为他们确实使用它。

关于C# LuaInterface 类运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18136812/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com