我在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
该功能实际上已被调用,但我不确定它是否正常工作...
答案 0 :(得分:0)
将功能定义更改为:
function item.HookMe(objj)
objj.name= "lalala"
end
原始定义中的冒号表示该函数还具有self
参数。这些函数的调用方式如下:object:HookMe()
。但是你想直接调用它,所以冒号不适用。
编辑:
如果您想保留函数定义并保留self
,请按以下方式调用它:
lf.Call(null, obj);
要调用它也传递self
对象:
lf.Call(lua["item"], obj);
答案 1 :(得分:0)
似乎问题是Lua方法的设计(但它实际上取决于意图):
而不是
function item:HookMe(objj)
-- self not used
objj.name= "lalala"
end
在给定的示例中,这会更好:
function item:HookMe()
self.name= "lalala"
end
原因(在其他答案中也讨论过)是使用方法语法(:
)声明函数会添加隐含的第一个形式参数self
。调用者可以传递任何东西作为第一个实际参数,但契约通常是传递函数的父表,以便它可以访问其兄弟字段。
在这种情况下,name
似乎是HookMe
的兄弟,因此该方法不应该在作为objj
传递的任意表上运行,而是在{{1}上运行}}