设置全局需求

时间:2016-08-26 23:16:30

标签: lua lua-table

我有以下代码段

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

我可以对代码进行修改,使其仅加载一次吗?

由于

1 个答案:

答案 0 :(得分:1)

您可能不应该覆盖全局require功能。如果您想运行第三方或用户代码,您可以将其沙箱化,否则您只需使用其他名称,例如my_require()load_awesome_stuff()

我会假设您不知道首先调用两个函数initializeWorld()initializeUniverse()中的哪一个,尽管此解决方案可以正常工作。

只需在某个名称下定义函数,无论您最喜欢哪个,但如果可能,请避免全局require,在某些时候您可以确定它在这两个初始化函数之前运行。然后你可以在它们中使用它。如果您希望将其称为require,则可以在函数体中本地定义local require = my_require; require "some_stuff"