如何使用C+检查Lua中是否存在预加载的模块+; 我想知道如何用C++来检查Lua中是否存在预加载模块。

如何使用C+检查Lua中是否存在预加载的模块+; 我想知道如何用C++来检查Lua中是否存在预加载模块。,c++,lua,C++,Lua,我的代码: #include "lua.hpp" bool isModuleAvailable(lua_State *L, std::string name) { //what should be here? return false; } int main() { lua_State *L = luaL_newstate(); luaL_openlibs(L); lua_settop(L, 0); luaL_dostring(L, "pack

我的代码:

#include "lua.hpp"

bool isModuleAvailable(lua_State *L, std::string name)
{
    //what should be here?
    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 << "Module Available" << '\n';
    else
        std::cout << "Module Not Available" << '\n';

    if (isModuleAvailable(L, "B"))
        std::cout << "Module Available" << '\n';
    else
        std::cout << "Module Not Available" << '\n';

    if (isModuleAvailable(L, "C"))
        std::cout << "Module Available" << '\n';
    else
        std::cout << "Module Not Available" << '\n';
    lua_close(L);
}
Module Not Available
Module Not Available
Module Not Available
Module Available
Module Available
Module Not Available
我想要的结果:

#include "lua.hpp"

bool isModuleAvailable(lua_State *L, std::string name)
{
    //what should be here?
    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 << "Module Available" << '\n';
    else
        std::cout << "Module Not Available" << '\n';

    if (isModuleAvailable(L, "B"))
        std::cout << "Module Available" << '\n';
    else
        std::cout << "Module Not Available" << '\n';

    if (isModuleAvailable(L, "C"))
        std::cout << "Module Available" << '\n';
    else
        std::cout << "Module Not Available" << '\n';
    lua_close(L);
}
Module Not Available
Module Not Available
Module Not Available
Module Available
Module Available
Module Not Available

如何创建
isModuleAvailable()
函数,使代码能够按预期工作?

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

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;
}

先生,如果您能看看我刚刚编辑的问题,我将不胜感激:@ZackLee在您的问题已经收到答案时不要编辑它。你只是使答案无效,这对任何遇到此线程的人都没有帮助。换一个新问题。@ZackLee也,加载模块并将其放入
包中。预加载
完全没有意义,因为它们已经自动缓存在
包中。加载
@ZackLee回顾过去,我可能永远不应该使用
包发布。预加载
,因为现在你有了它。@ZackLee Downvote不是我的。如果你愿意,我们可以在聊天中讨论。