我不是Lua专家,但是我发表了一些文章来了解它是如何运作的。但是我调用属于C ++表的lua函数时遇到问题。
在下面描述的示例中,我试图从代码中调用foo:bar。呼叫成功。但是参数“a”是nil(返回值是正确的 - 当我将返回值更改为例如10时,它会显示正确的结果)
在将函数参数推送到脚本期间,我是否遗漏了某些内容?
lua_State* state = LuaIntegration->GetLuaState();
lua_getglobal(state, "foo");
if(lua_istable(state, lua_gettop(state))) {
lua_getfield(state, -1, "bar");
if(lua_isfunction(state, lua_gettop(state))) {
lua_pushinteger(state, 0);
if (lua_pcall(state, 1, 1, 0) != 0) {
ErrorMessage = lua_tostring(state, -1);
}
ReturnValue = lua_tointeger(state, -1);
}
}
它在lua中调用函数:
foo = base_foo:new()
function foo:new(o)
o = o or {}
setmetatable(o, self)
self.__index = self
return o
end
function foo:bar(a)
if a==10 then
return a
end
return 0
end
答案 0 :(得分:3)
你在C ++调用中忘记了糖。
如果您阅读Function Calls的lua manual部分,您会看到
致电
v:name(args)
是v.name(v,args)
的语法糖,除了v
仅评估一次。
这意味着base_foo:new()
实际上只是base_foo.new(base_foo)
。
这就是你在C ++调用中缺少的东西。
当你调用它时,你需要将表作为函数的第一个参数传递。