- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 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/
我发现我在 C#/Lua LuaInterface 项目中有严重的内存泄漏。我用 C# 编写了一个简单的测试函数,它每 0.5 秒从 Lua 循环调用一次。我可以看到 Lua 内存使用量随着每个循环而
我正在尝试使用 LuaInterface 加载 .net 程序集。如果我将程序集放在与我的可执行文件(以及我的 LuaInterface.dll 和 LuaNet.dll)相同的文件夹中,那么一切都很
我是 LuaInterface 的新手,有一个非常简单的问题:如何从 C# 访问多维 lua 表中的数据?我设法读取了字符串和整数值,但对表格并不幸运。我的目标是在(虚拟)GridView 中显示多维
我在 C# 中使用 LuaInterface,并且我“导出”了一些要在 Lua 中使用的自定义 C# 类。例如: local myVector = Vector2(10, 100) 但是,当我想像本例
我正在尝试使用 LuaInterface 将 Lua 脚本接口(interface)集成到我的 C# 项目中。 . 如果我执行语法正确的代码,它会按预期工作,但是一旦在脚本中引入语法错误(或任何其他错
我正在尝试将 LuaInterface 集成到 C# 中,但当我尝试将 C# 函数绑定(bind)到 Lua 时,出现了 System.NullReferenceException 。我尝试编译和运行
我一直在尝试使用 LuaInterface 将 Lua 集成到我的托管代码中。我正在使用我下载的程序集附带的 lua51.dll,但是当我尝试创建一个新的 Lua 对象时,构造函数失败并显示 ERRO
我有一些后台 lua 代码,我在每次启动时加载它们,它们工作正常,但有什么方法可以将它们转换为 C# 吗? 这是我的元表代码: player = {} player.__index = player
使用 NLua 运行 lua 脚本时如何调用函数? (一个 LuaInterface 分支)? 例如,现在我有: lua.LoadFile("C:\\test.lua") lua.Call(); 但是
我的 C# 代码中有一个字节数组,我需要将其传递给 LuaInterface 实例。我可以在 Lua 中使用 pack(),将生成的字符串传递给 C# 并使用 System.Text.Encoding
我正在使用 LuaInterface 将 LuaInterface 集成到 C# 程序中。我希望能够编写可以在程序中访问 C# 方法的脚本。 它访问的方法在单独的“子系统”中,我想让 Lua 方法定义
有没有人知道如何编写一个返回 LuaTable 值的 C# 函数(例如 {1 = "example1", 2 = 234, "foo"= "Foo Example"} ?我测试过的所有类型都返回非 p
我将 LuaInterface 导入到控制台项目中,引用它,并编写了一个小测试脚本。当我运行它时,我得到这个: Could not load file or assembly 'LuaInterfac
我正在尝试使用 LuaInterface 2.0.3 在我的 C# 应用程序中嵌入一些 Lua 脚本功能。到目前为止,这工作得很好,但我不知道如何限制对少数指定 .Net 类的访问。默认情况下,所有
我已将 LuaInterface 项目嵌入到使用 .NET Framework 4.0 以 C# 编写的应用程序中。编译 LuaInterface 和 Lua 5.1 后,我在我的应用程序中引用了它们
我有一个 Lua 模块 ( lpack ),我需要加载到 LuaInterface 中。我已经为该项目尝试了几种不同的配置,但我似乎无法弄清楚链接。 我收到错误 unresolved external
我想传递一个 WinForm 对象给 Lua,我的代码: //Form1.cs class Form1 { private System.Windows.Forms.TextBox textBox
当我尝试使用 LuaInterface 时在 Linux 上的 Mono 上(在 Ubuntu 9.04 上使用 Mono 2.0)我得到以下异常: ** (App.exe:8599): WARNIN
我正在尝试将 Lua 连接到我正在制作的 VB.net 游戏。现在,我已经阅读了足够多的内容,知道我可以像这里看到的那样自行连接每个函数: pLuaVM.RegisterFunction("quit"
因为我的游戏,我真的很想用 Mono-usable,似乎不能在 Linux 下运行,因为 LuaInterface 是个 SCSS (参见 the relevant SO thread 了解更多信息)
我是一名优秀的程序员,十分优秀!