You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lua中全局require与函数内局部require的差异及缓存机制问询

Lua的require缓存机制是否受调用位置影响?

Lua的package.loaded缓存机制完全不受require调用位置的影响。不管你是在全局作用域、函数内部还是其他任何地方调用require,只要指定的模块名称一致,就只会在第一次调用时真正加载并执行模块的代码,后续所有对该模块的require调用都会直接返回package.loaded[modName]中缓存的结果,不会重复执行模块代码。

针对你给出的示例:

  • script1在全局作用域调用一次require "module"后,后续两个函数直接复用缓存的模块对象,这是常规用法。
  • script2虽然在两个不同的函数作用域里分别调用require "module",但本质和script1没有区别:不管哪个函数先执行,第一次require会加载module.lua并将结果存入缓存,第二次调用时直接从缓存取出模块对象,模块代码不会被重复执行,两个函数里的table变量指向的是同一个对象。

修正后的代码示例:

module.lua

local Table = {}
local function print_func(message)
    print(message)
end

Table.print_func = print_func

return Table

script1.lua

local table = require "module"
local function perform()
    table.print_func("PERFORM")
end

local function work()
    table.print_func("WORK")
end

script2.lua

local function do_something()
    local table = require "module"
    table.print_func("DO")
end

local function work()
    local table = require "module"
    table.print_func("WORK")
end

(注:原script2里的函数名do是Lua的关键字,这里改成do_something避免语法错误)

内容的提问来源于stack exchange,提问作者asn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 13:18:15