如何在C++中通过sol2(v3.3.0)正确运行Lua协程?
在C++中使用sol2正确运行Lua协程的解决方法
你遇到的问题核心是直接将sol::function转换为sol::coroutine无法正确初始化协程上下文,导致调用co()时没有执行预期逻辑。以下是两种可行的解决方案:
方案一:Lua侧预先创建协程再传入C++
在Lua代码中,先通过coroutine.create()将函数包装为协程对象,再传递给C的run_coroutine函数。C侧直接接收sol::coroutine类型并调用即可:
#include <sol/sol.hpp> int main() { sol::state lua; lua.open_libraries(sol::lib::base); lua.set_function("run_coroutine", [](sol::coroutine co) { co(); // 执行到第一个yield,输出"1" co(); // 恢复执行到第二个yield,输出"2" co(); // 恢复执行完成,输出"3" }); lua.script(R"( function story() print("1") coroutine.yield() print("2") coroutine.yield() print("3") end // 将函数包装为协程后传入 run_coroutine(coroutine.create(story)) )"); }
方案二:C++侧手动将函数包装为协程
如果不想修改Lua侧代码,可以在C++中通过sol::coroutine的构造函数,传入Lua状态和函数对象,手动初始化协程上下文:
#include <sol/sol.hpp> int main() { sol::state lua; lua.open_libraries(sol::lib::base); lua.set_function("run_coroutine", [&lua](sol::function func) { // 传入Lua状态和函数,正确创建协程对象 sol::coroutine co(lua.lua_state(), func); co(); co(); co(); }); lua.script(R"( function story() print("1") coroutine.yield() print("2") coroutine.yield() print("3") end run_coroutine(story) )"); }
为什么原代码不工作?
原代码中sol::coroutine co = func;只是做了类型转换,并没有为函数创建新的协程执行上下文。Lua协程需要明确的初始化步骤(无论是Lua侧的coroutine.create还是C++侧通过Lua状态构造),才能在调用co()时正确执行协程逻辑并响应yield。
两种方案执行后都会输出预期结果:
1 2 3
内容的提问来源于stack exchange,提问作者Harumaki
相关产品推荐
相关产品推荐

