如何在 Lua 中实现 Include Guard 防止重复加载同一文件?

你如何在 Lua 中实现 Include Guard?因为当两个文件 require 同一个 Lua 文件时,有时效果是出乎意料的。所以我希望 Lua 只处理一次文件。

点赞
用户4984564
用户4984564

通常情况下不需要这么做。

Lua 的 require 函数首先检查表 package.loaded 是否存在您尝试载入的名称。如果存在,就会取出;否则,如果该模块确实被载入,它将把它写入该表中,以便下次可以使用。

简单来说:requrie 是带有记忆功能的。

请注意,这仅适用于一个模块返回一个表或一个函数的常规情况。

当一个模块返回 nil 时,它将被转换为 true。然而,如果模块返回 false,它将把 false 写入 package.loaded中,导致需要一遍又一遍地重新加载。


我刚意识到这并没有回答实际问题,因为极少会有必要使用真正的 include guard。

不用说,

不要使用除非您确实需要

假设有一个名为 foo 的模块如下:

local foo = {}

print 'Loading module; this should only happen once'

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

return foo

它可以简单地修改为类似于这样:

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

我使用 _G 以便即使在某些修改过的环境中也能正常运行。希望创建环境的人已经很友好地为 _G 提供了一个全局环境,这是应该始终提供的。在正常情况下,它并没有什么实际作用,除非您使用名称和全局变量相同。

2019-09-11 08:36:01