【问题标题】:call Lua function from C++ conditionally有条件地从 C++ 调用 Lua 函数
【发布时间】:2016-02-15 06:41:51
【问题描述】:

我正在使用 Lua 编写 scipts 并将它们嵌入到 C++ 中。我在这个过程中使用了 LuaBridge

在我的 Lua 脚本中,我有需要首先检索一些变量以便在 C++ 中使用,此外,我还有一个非常简单的函数:

run = function()
    print ("state is on!")
end

但是,此函数仅在特定条件下调用。即仅在经过一系列复杂计算后从 C++ 代码中获得“真”时调用。

受限于我对 Lua 和 LuaBridge 的了解,我知道的是:在我做之后

loadscript(L, "script.lua")
lua_pcall(L,0,0,0)

我可以通过使用从 Lua 脚本中读取变量和函数

LuaRef blabla = getGlobal(L, "blabla")

但现在,我需要先读出变量并使用它们,然后在成员函数中使用它们

LuaRunner::LuaRun(){}

在单独的 C++ 类中定义

class LuaRunner

条件将被获取,如果条件为“真”,将调用此 run() 函数。最好在 C++ 成员函数中直接调用这个 run() 函数

LuaRunner::LuaRun(){}

由于进一步处理的限制。

因此,我想知道这是否可能:

使用

读出函数
LuaRef run = getGlobal(L, "run")

和其他变量一起“保存”这个run()函数在C++代码的某处(可能是类成员函数),然后运行() 函数可以稍后由同一类中的指针或对象调用。这可能吗?如果可能,该怎么做?或者还有什么好主意?

【问题讨论】:

  • 是否要在 C++ 方法中使用 lua 函数“run”作为结果回调?
  • @Daniel c++ 方法中的“回调”是什么意思?很抱歉我是这方面的新手,您能否详细描述一下或给我一些网页链接?
  • 回调只是一个作为参数传递给另一个函数的函数。 en.wikipedia.org/wiki/Callback_(computer_programming)
  • @Daniel 看起来很酷,我会详细学习并尝试,谢谢推荐这个

标签: c++ function lua luabridge


【解决方案1】:

可以将 luabridge::LuaRef 存储在 C++ 中,以便稍后调用它们,就像您通常调用任何其他函数一样。虽然有时没有必要在任何地方存储 LuaRef。加载脚本后,所有函数都保留在 lua_State 中,除非您将它们设置为 nil 或通过加载另一个使用相同函数名称的脚本来覆盖它们。您可以使用 getGlobal 函数获取它们。如果你的 Lua 函数接受参数,你可以使用 LuaRef 的 operator() 像这样传递它们:

if(...) { // your call condition
    LuaRef f = getGlobal(L, "someFunction");
    f(arg1, arg2, ...); // if your function takes no arguments, just use f();
}

【讨论】:

  • 感谢您的回答!如果条件在一个离主函数很远的类成员函数中怎么办(比如:主函数调用一个类成员函数,然后这个调用另一个类成员函数,再调用另一个,以此类推,然后到我所在的函数in.....),我应该一直将 lua 状态 L 作为函数参数传递吗?
  • 好吧,你要么将指针传递给 lua_State ,要么传递给 LuaRef 本身。或者,您可以将 LuaRef 存储在使用该函数的类中。
  • 好的..通过“将LuaRef存储在使用该函数的类中”,您的意思是将LuaRef存储为该类的成员吗?或者将(例如)LuaRef f = getGlobal(L, "someFunction") 存储在使用该函数的类中?
  • 是的,您可以将其存储为会员。 (或静态成员,不在实例之间创建不必要的副本)
  • 酷..我从来没有将一个类存储为另一个类的成员..让我试试
猜你喜欢
  • 2011-01-14
  • 2014-09-01
  • 1970-01-01
  • 2013-05-22
  • 2013-02-19
  • 2015-12-30
  • 2022-01-04
  • 2015-07-14
相关资源
最近更新 更多