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

Posted

技术标签:

【中文标题】Lua - C++ 集成:从 C++ 调用表中的函数【英文标题】:Lua - C++ Integration: Calling function in table from C++ 【发布时间】:2016-08-04 11:58:17 【问题描述】:

我不是 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

【问题讨论】:

【参考方案1】:

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

如果您阅读lua manual 的Function Calls 部分,您会看到

调用v:name(args)v.name(v,args) 的语法糖,但v 只计算一次。

这意味着base_foo:new() 真的只是base_foo.new(base_foo)

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

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

【讨论】:

嗯,有道理。谢谢

以上是关于Lua - C++ 集成:从 C++ 调用表中的函数的主要内容,如果未能解决你的问题,请参考以下文章

Cocos2dLua3.17.2集成FairyGUI之 lua绑定 getGroup() 调用问题

嵌入在 C++ socket.http 中的 LUA [错误:尝试调用 nil 值]

从 C++ 遍历 Lua 表?

从lua的c源码了解lua栈结构和函数调用流程

lua 与 c++或者c 交互的底层原理谁能解释一下?最最底层的,为啥它们调用C或者C++的函数?

有没有办法将 lua 函数从 C++ 更改为 nil,例如 changefunction(thefunction) 并且在调用时变为 nil