3

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

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

这是 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

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

4

2 回答 2

0

将函数定义更改为:

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

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

编辑:
如果要保留函数定义和保留self,请像这样调用它:

lf.Call(null, obj);

调用它也传递self对象:

lf.Call(lua["item"], obj);
于 2015-03-09T10:56:25.940 回答
0

似乎问题出在 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-10T16:37:51.080 回答