如何将对象从c#传递到lua';s函数?

如何将对象从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代码: 功能项:

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

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

这是c代码:

公共类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”可以工作?