如何将对象从 c# 传递到 lua 的函数
本文关键字:lua 函数 对象 | 更新日期: 2024-11-05 08:17:12
我在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
该函数实际上正在被调用,但我不确定它是否不起作用......
将函数定义更改为:
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
上运行。