模块需要通过函数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学习笔记之模块、包相关推荐

  1. Python学习笔记:第三方模块2

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  2. 《Go语言圣经》学习笔记 第十章 包和工具

    <Go语言圣经>学习笔记 第十章 包和工具 目录 包简介 导入路径 包声明 导入声明 包的匿名导入 包和命名 工具 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. G ...

  3. python中socket模块常用吗_python网络学习笔记——socket模块使用记录

    此文章记录了笔者学习python网络中socket模块的笔记. 建议初次学习socket的读者先读一遍socket模块主要函数的介绍. socket模块的介绍可以参考笔者的前一篇关于socket官方文 ...

  4. 微信小程序连接物联网(二):NodeMCU Lua学习笔记

    索引 这是用微信小程序遥控开门的系列文章,具体微信小程序连接物联网的代码在第三章提及. 微信小程序连接物联网(一):初始化ESP8266 NodeMCU 微信小程序连接物联网(二):NodeMCU L ...

  5. Python学习笔记13_模块

    Python学习笔记13_模块 文章目录 Python学习笔记13_模块 1.导入模块和的方法及使用 2.分层的文件系统中常用的包结构 3.OS 模块 4.sys 模块 5.math 模块 6.ran ...

  6. Lua学习笔记6:C++和Lua的相互调用

    曾经一直用C++写代码.话说近期刚换工作.项目组中的是cocos2dx-lua,各种被虐的非常慘啊有木有. 新建cocos2dx-lua项目.打开class能够发现,事实上就是C++项目啦,只是为什么 ...

  7. Lua 学习笔记(一)

    Lua学习笔记 1.lua的优势 a.可扩张性     b.简单     c.高效率     d.和平台无关 2.注释 a.单行注释 --        b.多行注释 --[[  --]] 3.类型和 ...

  8. R语言可视化学习笔记之ggridges包绘制山峦图

    作者:严涛 浙江大学作物遗传育种在读研究生(生物信息学方向)伪码农,R语言爱好者,爱开源. 严涛老师的绘图教程还有: gganimate |诺奖文章里面的动图绘制教程来了!! ggplot2学习笔记之 ...

  9. Verilog学习笔记-——Verilog模块例化

    Verilog学习笔记---Verilog模块例化 在一个模块中引用另一个模块,对其端口进行相关连接,叫做模块例化.模块例化建立了描述的层次.信号端口可以通过位置或名称关联,端口连接也必须遵循一些规则 ...

最新文章

  1. 大学毕业想要转行学软件测试,怎样入门比较好?
  2. linux/unix系统编程手册11-15
  3. DL-4 深度学习中的batch_size、epoch、iteration的区别
  4. Excahange2007邮件收件人的管理
  5. 2019年财政收支分析_2019年CPI走势预测与分析
  6. jieba分词(python使用篇)(一)
  7. 1055 The World‘s Richest (25 分)【难度: 一般 / 知识点: 多关键字排序】
  8. 【IPFS + 区块链 系列】 入门篇 - IPFS + Ethereum (下篇)-ipfs + Ethereum 大图片存储
  9. 【转】 SED多行模式空间
  10. CAP理论与MongoDB一致性、可用性的一些思考
  11. SpringMVC接受List的几种方式
  12. 2.8 GloVe 词向量
  13. 【Java从0到架构师】Redis 应用 - Jedis 基本使用、使用缓存的用户登陆、缓存常见问题
  14. 德宝怡高获批省大数据产业园
  15. 电脑端如何截屏网页全部内容|网页截长图
  16. 三菱plc232数据线驱动下载_程序怎么上传下载?以西门子S7-200PLC为例为你讲解
  17. 面试常问:TCP 三次握手与四次挥手详解
  18. 智能家居雷达感应技术,存在感应毫米波雷达应用
  19. JavaWeb专栏之(一):什么是JavaWeb?
  20. 写个数仓吧(15)品牌复购率——ADS层

热门文章

  1. 数据库SQL的分组函数
  2. 对 VR 项目开发流程的调研
  3. Sql字符串操作函数
  4. [bzoj1025][SCOI2009]游戏 (分组背包)
  5. 《信息检索导论》第三章总结
  6. 编写MOSS自定义字段类型的小意外
  7. 扩展Ext2类 Extending Ext2 Class
  8. 5gnr帧结构特点有哪些_厂区隔离网有哪些特点?为什么普遍采用框架式结构?...
  9. 小学生学python到底能干什么-颤抖 | 小学生都开始学Python了,十年后你还有工作么?...
  10. python工程师是什么专业-猎维科技告诉你人工智能工程师与Python工程师有什么区别?...