Вызвать функцию Lua из C++ условно
Я использую Lua для написания скриптов и встраивания их в 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() будет вызвана, если условие имеет значение "true". Лучше всего вызывать эту функцию run() прямо в функции-члене C++
LuaRunner::LuaRun(){}
из-за ограничения дальнейшей обработки.
Поэтому мне было интересно, возможно ли это:
Считайте функцию, используя
LuaRef run = getGlobal(L, "run")
вместе с другими переменными в начале и "сохранить" эту функцию run() где-нибудь в кодах C++ (возможно, в качестве функции-члена класса), а затем функцию run() можно вызвать позже указателем или объектом в том же самом учебный класс. Будет ли это возможно? Если возможно, как это сделать? Или есть другие хорошие идеи?
1 ответ
Можно хранить luabridge::LuaRef в C++, чтобы вызывать их позже, как вы обычно вызываете любую другую функцию. Хотя иногда нет необходимости хранить LuaRef в любом месте. Как только вы загрузите скрипт, все функции останутся в вашем lua_State, если вы не установите их в nil или не переопределите их, загрузив другой скрипт, который использует те же имена для функций. Вы можете получить их с помощью функции getGlobal. Если ваша функция Lua принимает аргументы, вы можете передать их, используя оператор LuaRef () следующим образом:
if(...) { // your call condition
LuaRef f = getGlobal(L, "someFunction");
f(arg1, arg2, ...); // if your function takes no arguments, just use f();
}