您如何在Lua中实现包含卫队?因为当两个文件require相同的lua文件时,有时效果是出乎意料的。所以我想lua只处理一次文件。
通常不需要这样做。
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的每个人都应该做的。在正常情况下,除非您有一个与全局变量一样命名的局部变量,否则实际上并不会做很多事情。