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
相关产品推荐
相关产品推荐

