我在 C++ 中使用 sol2 (v3.3.0) 来运行 Lua 协程。我想将 Lua 函数传递给 C++ 并将其作为协程执行。但是,我尝试将
sol::function
转换为 sol::coroutine
不起作用。
这是一个不起作用的最小示例:
#include <sol/sol.hpp>
int main() {
sol::state lua;
lua.open_libraries(sol::lib::base);
lua.set_function("run_coroutine", [](sol::function func) {
sol::coroutine co = func;
co();
co();
co();
});
lua.script(R"(
function story()
print("1")
coroutine.yield()
print("2")
coroutine.yield()
print("3")
end
run_coroutine(story)
)");
}
预期输出是
1
2
3
但实际上什么也没显示。
如何在C++中正确运行Lua函数作为协程?
按照官方示例,我自己解决了这个问题,所以我在这里发布解决方案。
#include <sol/sol.hpp>
int main() {
sol::state lua;
lua.open_libraries(sol::lib::base, sol::lib::coroutine);
lua.set_function("run_coroutine", [&lua](sol::function f) {
sol::thread runner_thread = sol::thread::create(lua);
sol::state_view runner_thread_state = runner_thread.state();
sol::coroutine co(runner_thread_state, f);
co();
co();
co();
});
lua.script(R"(
function story()
print("1")
coroutine.yield()
print("2")
coroutine.yield()
print("3")
end
run_coroutine(story)
)");
}
现在应该可以了,但我不完全确定为什么。如果对 Lua 线程有更多了解的人可以提供进一步的见解,我将不胜感激。