如何在lua中实现包含保护以防止lua多次加载同一文件?

kur*_*urt 0 lua

您如何在Lua中实现包含卫队?因为当两个文件require相同的lua文件时,有时效果是出乎意料的。所以我想lua只处理一次文件。

Dar*_*yer 6

通常不需要这样做。

Luas require函数首先在表中检查package.loaded您要使用的名称,如果存在则使用该名称。如果没有,它将实际加载该模块,它将把它写入该表中,以便下次使用。

简而言之:requrie被记住。

请注意,这在模块返回表或函数的通常情况下适用。

当模块返回时nil,它将变为true。但是,如果模块返回false,它将写入false到package.loaded,导致它一次又一次地加载。


我只是意识到,这并没有为实际需要使用真正的包含保护的冒犯提出问题。

不用说,

除非您知道自己确实需要它,否则不要使用它

给定这样的模块foo:

local foo = {}

print 'Loading module; this should only happen once'

function foo.id(...) return ... end

return foo
Run Code Online (Sandbox Code Playgroud)

可以很容易地将其修改为如下形式:

local function load()
    local foo = {}

    print 'Loading module; this should only happen once'

    function foo.id(...) return ... end

    return foo
end

if not _G.FOO_HAS_BEEN_LOADED then
    _G.FOO_HAS_BEEN_LOADED = load()
end

return _G.FOO_HAS_BEEN_LOADED
Run Code Online (Sandbox Code Playgroud)

我使用的_G,希望的是,即使这在运行一些奇怪的修改后的环境,谁创造了它一直是一种足以提供全球环境中_G的每个人都应该做的。在正常情况下,除非您有一个与全局变量一样命名的局部变量,否则实际上并不会做很多事情。