Lua-C++集成:从C++调用表中的函数

Lua - C++ Integration: Calling function in table from C++

本文关键字:函数 调用 C++ 集成 Lua-C++      更新时间:2023-10-16

我不是Lua专家,但我已经阅读了一些文章来了解它是如何工作的。然而,我在从C++调用属于表的lua函数时遇到了问题。

在下面描述的例子中,我试图从代码中调用foo:bar。呼叫成功。然而,参数"a"为零(返回值是正确的-当我将返回值更改为例如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

您在C++调用中忘记了糖。

如果你阅读lua手册的函数调用部分,你会看到

调用v:name(args)v.name(v,args)的语法糖,只是v只被求值一次。

这意味着base_foo:new()实际上只是base_foo.new(base_foo)

这就是您在C++调用中缺少的内容。

调用该函数时,需要将该表作为第一个参数传递给它。