【Lua】模块与包
定义:
从用户观点来看,一个模块就是一个程序库,可以通过require来加载(require用于使用模块,module用于创建模块),然后便得到了一个全局变量,表示一个table,这个table就像一个名字空间,其内容就是模块中导出的所有东西,例如函数和变量。一个规范的模块还应使require返回这个table
require函数:
require实现如下:
说明:
table package.loaded检查模块是否已经加载,如果加载require返回相应的值,只要一个模块已加载,后续的require调用都会返回同一个值,不会再次加载。
如果模块未加载,require会尝试为该模块找到一个加载器(loader,代码中一抽象函数findloader表示),会现在table package.preload 中查询传入的模块名,如果在其中找到了一个函数,就以该函数作为模块的加载器。
如果require为指定的模块找到了一个Lua文件,它就通过loadfile加载文件,如果找到的是一个C程序库,就通过loadlib加载,loadfile和loadlib都只是加载代码,并没有运行他们,require将返回值存储到table package.loaded中,以此作为将来对同一模块调用的返回值,如果加载器没有返回值,require就会返回table package.loaded 中的值。
注意,上述代码中在调用加载器前,require将true赋给package.loaded相应字段,以此将模块标记为已加载。这是因为如果一个模块要求加载另一个模块,而后者有递归的加载前者,那么后者的require调用会马上返回,从而避免无限循环。
若要强制使require对同一个库加载两次,可以删除package.loaded中的模块,再次加载该模块:
require路径:
require采用的路径是一连串的模式,其中每项都是一种将模块名转换为文件名的方式,路径中每项都是一个文件名,每项中还包含一个可选的问号。require会以模块名来代替每个“?”然后根据替换结果检查是否存在这样一个文件,如果不存在,就会尝试下一项,路径中每项以分号隔开,require用于搜索Lua文件的路径存放在变量package.path中,如果require无法找到模块名相符的Lua文件,它就会找C程序库,输出package.path 和package.cpath分别如下:
、
调用 require("sql")时,将分别尝试打开如下文件:
.\sql.lua
D:\Lua\5.1\lua\sql.lua
.......
module函数:
默认情况下module不提供外部访问。 module函数,其对应的功能实现如下:
module不提供外部访问,必须在调用它前,为需要访问的外部函数或者模块声明适当的局部变量,也可以通过继承实现外部访问,只需在调用module时加上一个选项,package.seeall,这个选项等价于以下代码:
因此,只需要如下使用:
子模块与包:
Lua支持具有层级性的模块名,可以用一个点来分隔名称中的层级。假如,一个模块名为mod.sub,那么它就是mod的一个子模块,在搜索一个定义子模块的文件时,require会将点转换为另一个字符,通常就是系统的目录分隔符(UNIX上为"/",Windows上为"\")
【Lua】模块与包的更多相关文章
- Step By Step(Lua模块与包)
Step By Step(Lua模块与包) 从Lua 5.1开始,我们可以使用require和module函数来获取和创建Lua中的模块.从使用者的角度来看,一个模块就是一个程序库,可以通过requi ...
- lua 模块与包(五)
一.模块的介绍 模块类似于1个封装库,从Lua 5.1 开始,Lua加入了标准的模块管理机制,可以把一些公用的代码放在一个文件里,以API接口的形式在其他地方调用,用利于代码的重用和降低代码的耦合度. ...
- Lua中的模块与包
[前言] 从Lua5.1版本开始,就对模块和包添加了新的支持,可是使用require和module来定义和使用模块和包.require用于使用模块,module用于创建模块.简单的说,一个模块就是一个 ...
- Chapter 15_0 模块和包
通常,Lua不会设置规则,相反会提供很多强有力的机制来使开发者有能力实现出最适应的规则. 然而,这种方法对于模块就不行了.模块系统的一个主要目标是允许以不同的形式来共享代码. 但若没有一项公共的规则就 ...
- lua模块demo(redis,http,mysql,cjson,本地缓存)
1. lua模块demo(redis,http,mysql,cjson,本地缓存) 1.1. 配置 在nginx.conf中设置lua_shared_dict my_cache 128m; 开启ngi ...
- skipper lua 添加luarocks 包管理
skipper 支持基于lua 的script 扩展,同时设计比较方便的filter模型,让我们可以方便 进行request.response的扩展,结合lua 社区的包我们可以快速的进行新功能的开发 ...
- nginx 增加 lua模块
Nginx中的stub_status模块主要用于查看Nginx的一些状态信息. 本模块默认是不会编译进Nginx的,如果你要使用该模块,则要在编译安装Nginx时指定: ./configure –wi ...
- 如何创建一个 Lua 模块
如何创建一个 Lua 模块 翻译自: How to Create a Lua Module 译者: FreeBlues 正文 Lua编程语言 中的一个 模块(module)是一个包含函数和变量的代码片 ...
- Nginx使用Lua模块实现WAF
前言:最近一段时间在写加密数据功能,对安全相关知识还是缺少积累,无意间接触到了WAF相关知识,刚好Nginx可以实现WAF功能,也简单学习了Lua这门语言,分享下 一.WAF产生的背景 过去企业通常会 ...
- python常用模块(模块和包的解释,time模块,sys模块,random模块,os模块,json和pickle序列化模块)
1.1模块 什么是模块: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文 ...
随机推荐
- mysql的MyISAM 和 InnoDB 的区别?优化MYSQL数据库的方法?
MyISAM 和 InnoDB 的基本区别 1.InnoDB不支持FULLTEXT类型的索引. 2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from tabl ...
- TestNG入门教程
阅读目录 TestNG介绍 在Eclipse中在线安装TestNG 在Eclipse中离线安装Testng TestNG最简单的测试 TestNG的基本注解 TestNG中如何执行测试 使用testt ...
- Access数据操作-02
数据库连接 MDB文件 :Provider=Microsoft.Jet.OLEDB.4.0;Data Source=*.mdb ;Persist Security Info=False; AccDB文 ...
- Putty的安装和使用
Putty是最简单易用的SSH工具,详细介绍其安装和使用 直接在百度里搜索Putty,可以找到百度软件中心,或者官方网站: PuTTY Download Page. 进入官方网站,直接可执行文件装 ...
- mysql触发器的实战经验-不错的文章
1 引言 Mysql的触发器和存储过程一样,都是嵌入到mysql的一段程序.触发器是mysql5新增的功能,目前线上凤巢系统.北斗系统以及哥伦布系统使用的数据库均是mysql5.0.45版本,很多 ...
- Discuz 模板标签说明
Discuz 模板标签说明 Discuz! 的模板采用近似 PHP 表达式的语法,基本都是可识别的HTML,但涉及到变量和动态内容时,基本形式下: <!-{ 代码内容 }-> 逻辑元素包围 ...
- Android 在界面中显示以及输入文本信息 TextView和EditText
Android控件之TextView和EditTextTextView:显示文本框控件EditText:输入文本框TextView和EditText的常用属性TextView控件的常用属性androi ...
- JavaScript基础细讲
JavaScript基础细讲 JavaScript语言的前身叫作Livescript.自从Sun公司推出著名的Java语言之后,Netscape公司引进了Sun公司有关Java的程序概念,将自己原 ...
- .net 防盗链
Global.asax 文件中 protected void Application_BeginRequest(object sender, EventArgs e) { //判断当前请求是否是访问 ...
- Hadoop DBOutputFormat的使用
最近在研究数据在HDFS和关系型数据库之间的迁移,主要使用了两种方式:一是,按照数据库要求的文件格式生成文件,然后由数据库提供的导入工具进行导入:二是采用JDBC的方式进行导入.MapReduce默认 ...