【问题标题】:How to check if preloaded module exists in Lua using C++如何使用 C++ 检查 Lua 中是否存在预加载的模块
【发布时间】:2019-01-16 09:55:18
【问题描述】:

我想知道如何使用 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, "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() 函数以便我的代码可以按预期工作?

【问题讨论】:

    标签: c++ lua


    【解决方案1】:

    只需检查字段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;
    }
    

    【讨论】:

    • 先生,如果您能看看我刚刚编辑的问题,我将不胜感激:stackoverflow.com/questions/51701228/…
    • @ZackLee 不要编辑已经收到答案的问题。您只是使答案无效,这对遇到此线程的任何人都没有帮助。而是提出一个新问题。
    • @ZackLee 另外,加载模块并将它们放入package.preload 是完全没有意义的,因为它们已经自动缓存在package.loaded 中。
    • @ZackLee 回想起来,我可能永远不应该使用package.preload 发布my answer,因为现在你有了这个hammer, everything looks like a nail
    • @ZackLee Downvote 不是我的。如果您愿意,我们可以在聊天中讨论。
    猜你喜欢
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 2020-05-12
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多