lua学习笔记之模块、包
模块需要通过函数require来加载,创建返回表。模块导出的所有如函数、常量作为一个工作空间。
1、require函数
require首先检查表package.loaded是否模块已经加载,如果已经加载,则返回对应的值。如果模块没有加载,require搜索模块名字对应的lua文件,搜索通过package.path来引导,如果找到文件,则使用loadfile加载,返回的结果是称为加载器的函数。如果没有找到模块名对应的lua文件,则搜索对应名字的c库文件,此时搜索是通过package.cpath变量来引导,如果找到,则使用package.loadlib,来查找称为luaopen_modname对应的函数。
1.1 模块重命名
对于多版本,可以使用mod-版本号。因为require在加载时是只取-号前的。
1.2、路径搜索
require使用的路径是一系列的模板,路径的模板是包含可选的问号标识的文件名,模板间使用分号相隔。
lua文件的搜索路径通过package.path变量指定。当模块包初始化时,变量名是通过LUA_PATH_5_3环境变量来设置,如果环境变量没有定义,使用环境变量LUA_PATH,如果两个都没有定义,使用编译定义的默认路径 。
c文件的搜索路径通过package.cpath变量指定。通过环境变量LUA_CPATH_5_3或者LUA_CPATH环境变量来指定。
1.3 搜索器
搜索lua文件和搜索c库仅仅是搜索器的两个实例。搜索器是一个函数,携带模块名,返回 模块的加载器或者nil.
数组package.searchers包含了require使用的搜索器。当搜索模块时,require调用每个搜索器来搜索模块名直到其中的一个找到模块的加载器。如果没有找到,require抛出错误。
默认配置中,搜索lua文件和搜索c库的搜索器分别位于列表中的第2个,第3个。在它们之前,是一个preload搜索器。
preload搜索器允许任意加载模块的函数定义。使用称为package.preload的表来映射模块名到加载函数。当搜索模块名时,搜索器在表中查找给定的名字,如果找到函数,则返回函数作为模块加载器,否则返回nil。搜索器提供了通用方法来处理一些非传统的情况,比如,静态链接到lua的c库可以注册它的luaopen函数到preload表中,以便当用户需要那个模块时可以被 调用 。
package.searchers的默认内容包含第四个函数,与子模块相关。
2、模块的基本写法
创建一个表,将所有需要导出的函数放入表中,并且返回这个表。
local M = {}local function new(r, i)return {r = r, i = i}
endM.new = newM.i = new(0, 1)function M.add(c1, c2)return new(c1.r + c2.r, c1.i + c2.i)
endfunction M.sub(c1, c2)return new(c1.r - c2.r, c1.i - c2.i)
endfunction M.mul(c1, c2)return new(c1.r * c2.r - c1.i * c2.i, c1.r * c2.i + c1.i * c2.r)
endlocal function inv(c)local n = c.r^2 + c.i^2return new(c.r / n, -c.i / n)
endfunction M.div(c1, c2)return M.mul(c1, inv(c2))
endfunction M.toString(c)return string.format("(%g, %g)", c.r, c.i)
endreturn M
另外一种写法如下
local M = {}
一些定义,最后加上
package.loaded[...] = M
第三种形式是先定义函数为本地函数,然后返回表
3、子模块和包
lua允许模块有层级关系,通过使用点来分离名字层级。
当使用require函数加载子模块时,首先查找package.loaded表,然后查找package.preload表,但是当搜索子模块的文件时,会将点翻译成系统的目录分隔符。
lua使用的目录分隔符是在编译时配置的,可以是任意字符串。对于没有层级目录的系统可以使用下划线来表示目录分隔符。
对于子模块的c库,require会将点翻译成下线线。比如a.b的初始化函数为luaopen_a_b
lua学习笔记之模块、包相关推荐
- Python学习笔记:第三方模块2
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- 《Go语言圣经》学习笔记 第十章 包和工具
<Go语言圣经>学习笔记 第十章 包和工具 目录 包简介 导入路径 包声明 导入声明 包的匿名导入 包和命名 工具 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. G ...
- python中socket模块常用吗_python网络学习笔记——socket模块使用记录
此文章记录了笔者学习python网络中socket模块的笔记. 建议初次学习socket的读者先读一遍socket模块主要函数的介绍. socket模块的介绍可以参考笔者的前一篇关于socket官方文 ...
- 微信小程序连接物联网(二):NodeMCU Lua学习笔记
索引 这是用微信小程序遥控开门的系列文章,具体微信小程序连接物联网的代码在第三章提及. 微信小程序连接物联网(一):初始化ESP8266 NodeMCU 微信小程序连接物联网(二):NodeMCU L ...
- Python学习笔记13_模块
Python学习笔记13_模块 文章目录 Python学习笔记13_模块 1.导入模块和的方法及使用 2.分层的文件系统中常用的包结构 3.OS 模块 4.sys 模块 5.math 模块 6.ran ...
- Lua学习笔记6:C++和Lua的相互调用
曾经一直用C++写代码.话说近期刚换工作.项目组中的是cocos2dx-lua,各种被虐的非常慘啊有木有. 新建cocos2dx-lua项目.打开class能够发现,事实上就是C++项目啦,只是为什么 ...
- Lua 学习笔记(一)
Lua学习笔记 1.lua的优势 a.可扩张性 b.简单 c.高效率 d.和平台无关 2.注释 a.单行注释 -- b.多行注释 --[[ --]] 3.类型和 ...
- R语言可视化学习笔记之ggridges包绘制山峦图
作者:严涛 浙江大学作物遗传育种在读研究生(生物信息学方向)伪码农,R语言爱好者,爱开源. 严涛老师的绘图教程还有: gganimate |诺奖文章里面的动图绘制教程来了!! ggplot2学习笔记之 ...
- Verilog学习笔记-——Verilog模块例化
Verilog学习笔记---Verilog模块例化 在一个模块中引用另一个模块,对其端口进行相关连接,叫做模块例化.模块例化建立了描述的层次.信号端口可以通过位置或名称关联,端口连接也必须遵循一些规则 ...
最新文章
- 大学毕业想要转行学软件测试,怎样入门比较好?
- linux/unix系统编程手册11-15
- DL-4 深度学习中的batch_size、epoch、iteration的区别
- Excahange2007邮件收件人的管理
- 2019年财政收支分析_2019年CPI走势预测与分析
- jieba分词(python使用篇)(一)
- 1055 The World‘s Richest (25 分)【难度: 一般 / 知识点: 多关键字排序】
- 【IPFS + 区块链 系列】 入门篇 - IPFS + Ethereum (下篇)-ipfs + Ethereum 大图片存储
- 【转】 SED多行模式空间
- CAP理论与MongoDB一致性、可用性的一些思考
- SpringMVC接受List的几种方式
- 2.8 GloVe 词向量
- 【Java从0到架构师】Redis 应用 - Jedis 基本使用、使用缓存的用户登陆、缓存常见问题
- 德宝怡高获批省大数据产业园
- 电脑端如何截屏网页全部内容|网页截长图
- 三菱plc232数据线驱动下载_程序怎么上传下载?以西门子S7-200PLC为例为你讲解
- 面试常问:TCP 三次握手与四次挥手详解
- 智能家居雷达感应技术,存在感应毫米波雷达应用
- JavaWeb专栏之(一):什么是JavaWeb?
- 写个数仓吧(15)品牌复购率——ADS层
热门文章
- 数据库SQL的分组函数
- 对 VR 项目开发流程的调研
- Sql字符串操作函数
- [bzoj1025][SCOI2009]游戏 (分组背包)
- 《信息检索导论》第三章总结
- 编写MOSS自定义字段类型的小意外
- 扩展Ext2类 Extending Ext2 Class
- 5gnr帧结构特点有哪些_厂区隔离网有哪些特点?为什么普遍采用框架式结构?...
- 小学生学python到底能干什么-颤抖 | 小学生都开始学Python了,十年后你还有工作么?...
- python工程师是什么专业-猎维科技告诉你人工智能工程师与Python工程师有什么区别?...