如何将对象从c#传递到lua';s函数?
我正在使用c#上的Lua接口将我创建的对象传递给Lua的函数。 它成功调用函数,但lua不断抛出错误: LuaInterface.LuaException:/hook.lua:32:尝试索引本地“objj”(一个空值) 这是c代码:如何将对象从c#传递到lua';s函数?,c#,.net,lua,luainterface,C#,.net,Lua,Luainterface,我正在使用c#上的Lua接口将我创建的对象传递给Lua的函数。 它成功调用函数,但lua不断抛出错误: LuaInterface.LuaException:/hook.lua:32:尝试索引本地“objj”(一个空值) 这是c代码: 公共类PerObj { 公共字符串名称; 公共PerObj() { } } PerObj obj=新PerObj(); luaffunction lf=lua.GetFunction(“item.HookMe”); 低频呼叫(obj); 这是lua代码: 功能项:
公共类PerObj
{
公共字符串名称;
公共PerObj()
{
}
}
PerObj obj=新PerObj();
luaffunction lf=lua.GetFunction(“item.HookMe”);
低频呼叫(obj);
这是lua代码:
功能项:HookMe(objj)
objj.name=“拉拉”
结束
函数实际上正在被调用,但我不确定它是否工作…将函数定义更改为:
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
。调用方可以将任何内容作为第一个实际参数传递,但契约通常是传递函数的父表,以便它可以访问其同级字段
在本例中,
name
似乎是HookMe
的兄弟,因此该方法不应该对作为objj
传递的任意表进行操作,而是对self
进行操作。这可能会对您有所帮助:我以前尝试过。仍然认为“一个nill值”item:HookMe(objj)
意味着您正在向HookMe
函数传递两个参数。第一个是self
,第二个是objj
。谢谢!如果这有一个self参数,如果我用“lf.call(null,obj);”调用函数(object:HookMe()),会发生什么?它会被忽略吗?调用函数时如何保留“self”?@Max Yes,您只需将null作为第一个参数传递给self
。这会使“self”(也在函数中使用)为零。保持自我的其他方法有哪些?@Max这取决于你对自我的期望。如果item
是一个对象,您可以这样调用它:call(lua[“item”],objj)
Hm,那么就没有办法让lua接口忽略第一个参数,所以当通过对象HookMe()调用它时,“self”可以工作?