Вызвать функцию 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();
}
Другие вопросы по тегам