如何将对象从 c# 传递到 lua 的函数?
How do you pass an object from c# to lua's function?
我在 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
实际上正在调用该函数,但我不确定它是否正常工作...
将函数定义更改为:
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
。调用者 可以 传递任何东西作为第一个实际参数,但约定通常传递函数的父 table 以便它可以访问其兄弟字段。
在这种情况下,name
似乎是 HookMe
的同级,因此该方法不应对作为 objj
传递的任意 table 进行操作,而是在 self
.
我在 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
实际上正在调用该函数,但我不确定它是否正常工作...
将函数定义更改为:
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
。调用者 可以 传递任何东西作为第一个实际参数,但约定通常传递函数的父 table 以便它可以访问其兄弟字段。
在这种情况下,name
似乎是 HookMe
的同级,因此该方法不应对作为 objj
传递的任意 table 进行操作,而是在 self
.