前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >五分钟技术分享|Lua语言的Require工作原理

五分钟技术分享|Lua语言的Require工作原理

作者头像
keyle
发布2024-11-01 12:17:22
发布2024-11-01 12:17:22
17800
代码可运行
举报
文章被收录于专栏:礼拜八不工作礼拜八不工作
运行总次数:0
代码可运行

最近准备开始写个系列分类叫五分钟技术分享,就是单章内容控制在五分钟适合碎片化的时间浏览。本期分享的主题是Lua语言中Require的工作原理

require从哪儿加载文件?

从 package.path 拼接当前require的路径进行查找,会从输出结果中挨个访问是否存在该文件,如果有就会通过loader(加载器)加载。

代码语言:javascript
代码运行次数:0
复制
print(package.path) --Windows测试环境

--;.\?.lua;C:\Program Files (x86)\Lua\5.1\lua\?.lua;C:\Program Files (x86)\Lua\5.1\lua\?\init.lua;C:\Program Files (x86)\Lua\5.1\?.lua;C:\Program Files (x86)\Lua\5.1\?\init.lua;C:\Program Files (x86)\Lua\5.1\lua\?.luac

将上面的?替换为文件名,就是尝试加载的文件地址,多个分号分隔代表会从多个路径进行优先级查找。

require的模块存在哪儿?

require的模块都存储在package.loaded。

代码语言:javascript
代码运行次数:0
复制
require "main"

for k, v in pairs(package.loaded) do
  print("loaded:" .. k .. "")
end

-- loaded:string
-- loaded:debug
-- loaded:package
-- loaded:_G
-- loaded:io
-- loaded:os
-- loaded:table
-- loaded:math
-- loaded:coroutine
-- loaded:main   这边出现了main文件名

require的唯一性

观察下面代码我们定义一个main.lua文件

代码语言:javascript
代码运行次数:0
复制
main = {}

print("load file main")

return main --缺省情况下默认return true

运行下面的代码会得到输出:

代码语言:javascript
代码运行次数:0
复制
local ma1 = require "main"
print(ma1)
local ma2 = require "main"
print(ma2)

-- load file main
-- table: 00EA98E8
-- table: 00EA98E8

可以看到 “load file main” 并不是每次被require的时候都会执行。只有在首次执行会输出。

让require的模块执行多次

默认没有return的情况下会走一个return true,lua会自己确保当前文件中执行函数只走一次就被缓存。 在显式添加return false的情况下,才会多次require每次都刷新package.loaded缓存过的数据。

代码语言:javascript
代码运行次数:0
复制
main = {}
print("load file main")
return false


在调用的文件中:
require "main"
require "main"
输出:
load file main
load file main

还有另外一种方式就是将package.loaded.main设置为nil,require的时候会发现loaded中存储的main找不到了,就会再次走加载流程。

代码语言:javascript
代码运行次数:0
复制
main = {}
print("load file main")
return main


在调用的文件中:
require "main"
package.loaded.main = nil
require "main"
输出:
load file main
load file main
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 礼拜八不工作 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • require从哪儿加载文件?
  • require的模块存在哪儿?
  • require的唯一性
  • 让require的模块执行多次
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档