如何使用 sol3 在 C++ 中运行 Lua 协程?

问题描述 投票:0回答:1

我在 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函数作为协程?

c++ lua coroutine sol3
1个回答
0
投票

按照官方示例,我自己解决了这个问题,所以我在这里发布解决方案。

#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 线程有更多了解的人可以提供进一步的见解,我将不胜感激。

© www.soinside.com 2019 - 2024. All rights reserved.