你如何将一个对象从C#传递到Lua的函数中?

我正在使用C#上的Lua接口,将我创建的对象传递给Lua的函数。

它成功地调用了该函数,但Lua一直在抛出错误:

LuaInterface.LuaException: /hook.lua:32: attempt to index local 'objj' (a nil value)

以下是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

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

点赞
用户1424244
用户1424244

将函数定义修改为:

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

在原始定义中的冒号表示该函数也具有 self 参数。这些函数可以像这样调用: object:HookMe()。但是您想直接调用它,所以冒号无法应用。

编辑:

如果您想保留函数定义并保留 self,请像这样调用它:

lf.Call(null, obj);

要传递 self 对象调用它:

lf.Call(lua["item"], obj);
2015-03-09 10:56:25
用户2226988
用户2226988

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

而不是

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

在给定的示例中,这将更有效:

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

原因(在其他答案中已经讨论得很好)是使用方法语法(:)声明函数时会添加一个隐含的第一个正式参数 self。调用者可以将任何东西作为第一个实际参数传递,但是合同通常要求传递函数的父表,以便它可以访问其兄弟字段。

在这种情况下,name 似乎是 HookMe 的兄弟,因此该方法不应该在传递为 objj 的任意表上运作,而应该在 self 上运作。

2015-03-10 16:37:51