如何用C++在Lua中检测预加载模块是否存在

我想知道如何用C++在Lua中检测预加载模块是否存在。

我的代码:

#include "lua.hpp"

bool isModuleAvailable(lua_State *L, std::string name)
{
    //这里应该写什么?
    return false;
}

int main()
{
    lua_State *L = luaL_newstate();
    luaL_openlibs(L);
    lua_settop(L, 0);
    luaL_dostring(L, "package.preload['A'] = function()\n"
                         "local a = {}\n"
                         "return a\n"
                     "end\n");
    luaL_dostring(L, "package.preload['B'] = function()\n"
                         "local b = {}\n"
                         "return b\n"
                     "end\n");

    if (isModuleAvailable(L, "A"))
        std::cout << "模块可用" << '\n';
    else
        std::cout << "模块不可用" << '\n';

    if (isModuleAvailable(L, "B"))
        std::cout << "模块可用" << '\n';
    else
        std::cout << "模块不可用" << '\n';

    if (isModuleAvailable(L, "C"))
        std::cout << "模块可用" << '\n';
    else
        std::cout << "模块不可用" << '\n';
    lua_close(L);
}

我得到的结果:

模块不可用
模块不可用
模块不可用

我想要的结果:

模块可用
模块可用
模块不可用

我应该如何创建 isModuleAvailable() 函数使得我的代码能够按预期工作?

点赞
用户1944004
用户1944004

只需检查字段 package.preload[name] 是否为 nil。我还将函数重命名为 isModulePreloaded,因为这是它的作用。

bool isModulePreloaded(lua_State *L, std::string const &name) {
    lua_getglobal(L, "package");
    lua_getfield(L, -1, "preload");
    lua_getfield(L, -1, name.c_str());
    bool is_preloaded = !lua_isnil(L, -1);
    lua_pop(L, 3);
    return is_preloaded;
}
2018-08-09 03:45:02