如何将对象从 c# 传递到 lua 的函数?

How do you pass an object from c# to lua's function?

我在 c# 上使用 Lua 接口将我创建的对象传递给 lua 的函数。 它成功调用了函数,但是 lua 一直抛出错误:

LuaInterface.LuaException: /hook.lua:32: 尝试索引本地 'objj'(零值)

这是 C# 代码:

public class PerObj
{
    public string name;
    public PerObj() 
    {
    }
}

PerObj obj = new PerObj();
LuaFunction lf = lua.GetFunction ("item.HookMe");
lf.Call(obj);

这里是 lua 代码:

function item:HookMe(objj)
    objj.name= "lalala"
end

实际上正在调用该函数,但我不确定它是否正常工作...

将函数定义更改为:

function item.HookMe(objj)
    objj.name= "lalala"
end

原定义中的冒号表示函数也有self参数。这些函数是这样调用的:object:HookMe()。但是你想直接调用它,所以冒号不适用。

编辑:
如果要保留函数定义并保留self,可以这样调用:

lf.Call(null, obj);

要调用它还传递 self 对象:

lf.Call(lua["item"], obj);

似乎问题出在Lua方法的设计上(但这实际上取决于意图):

而不是

function item:HookMe(objj)
    -- self not used
    objj.name= "lalala"
end

这在给定的示例中效果更好:

function item:HookMe()
    self.name= "lalala"
end

原因(在其他答案中也有讨论)是使用方法语法 (:) 声明函数会添加隐含的第一个形式参数 self。调用者 可以 传递任何东西作为第一个实际参数,但约定通常传递函数的父 table 以便它可以访问其兄弟字段。

在这种情况下,name 似乎是 HookMe 的同级,因此该方法不应对作为 objj 传递的任意 table 进行操作,而是在 self.