设置全局要求

Set a global require

我有以下代码片段

function initializeWorld()
    _G.require = function(name)
            if package.loaded[name] == nil then
                    local result, err = external.MyAPIEndpoint:LUAInclude(name .. '.lua') 
                    if err == nil then
                        if result ~= nil then
                                package.loaded[name] = result
                        else
                                package.loaded[name] = true
                        end

                        return package.loaded[name]
                    else
                        local errTxt = err .. "\r\n" .. debug.traceback()
                        error(errTxt, 1)
                    end
            else
                    return package.loaded[name]
            end
    end

    helloWorld = require ("helloWorld")
    print(helloWorld.welcome())
end

function initializeUniverse()
    _G.require = function(name)
            if package.loaded[name] == nil then
                    local result, err = external.MyAPIEndpoint:LUAInclude(name .. '.lua') 
                    if err == nil then
                        if result ~= nil then
                                package.loaded[name] = result
                        else
                                package.loaded[name] = true
                        end

                        return package.loaded[name]
                    else
                        local errTxt = err .. "\r\n" .. debug.traceback()
                        error(errTxt, 1)
                    end
            else
                    return package.loaded[name]
            end
    end

    helloUniverse = require ("helloUniverse")

    print(helloUniverse.welcome())

end

如您所见,global requires 在两个不同的地方使用。一次在 initializeWorld 另一个在 initializeUniverse

我可以修改代码使其只加载一次吗?

谢谢

您可能不应该覆盖全局 require 函数。如果你想 运行 第三方或用户代码,你可以将它沙盒化,否则你可以简单地使用不同的名称,如 my_require()load_awesome_stuff()

我假设您不知道 initializeWorld()initializeUniverse() 这两个函数中的哪一个首先被调用,尽管这个解决方案无论哪种方式都有效。

简单地用你最喜欢的名字定义函数,但如果可能的话避免全局 require,在某些时候你可以确定它 运行s 在其中任何一个之前两个初始化函数。然后你就可以在他们两个中使用它。如果你想让它被称为 require,你可以在函数体中本地定义它,比如 local require = my_require; require "some_stuff"