定义:

        从用户观点来看,一个模块就是一个程序库,可以通过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】模块与包的更多相关文章

  1. Step By Step(Lua模块与包)

    Step By Step(Lua模块与包) 从Lua 5.1开始,我们可以使用require和module函数来获取和创建Lua中的模块.从使用者的角度来看,一个模块就是一个程序库,可以通过requi ...

  2. lua 模块与包(五)

    一.模块的介绍 模块类似于1个封装库,从Lua 5.1 开始,Lua加入了标准的模块管理机制,可以把一些公用的代码放在一个文件里,以API接口的形式在其他地方调用,用利于代码的重用和降低代码的耦合度. ...

  3. Lua中的模块与包

    [前言] 从Lua5.1版本开始,就对模块和包添加了新的支持,可是使用require和module来定义和使用模块和包.require用于使用模块,module用于创建模块.简单的说,一个模块就是一个 ...

  4. Chapter 15_0 模块和包

    通常,Lua不会设置规则,相反会提供很多强有力的机制来使开发者有能力实现出最适应的规则. 然而,这种方法对于模块就不行了.模块系统的一个主要目标是允许以不同的形式来共享代码. 但若没有一项公共的规则就 ...

  5. lua模块demo(redis,http,mysql,cjson,本地缓存)

    1. lua模块demo(redis,http,mysql,cjson,本地缓存) 1.1. 配置 在nginx.conf中设置lua_shared_dict my_cache 128m; 开启ngi ...

  6. skipper lua 添加luarocks 包管理

    skipper 支持基于lua 的script 扩展,同时设计比较方便的filter模型,让我们可以方便 进行request.response的扩展,结合lua 社区的包我们可以快速的进行新功能的开发 ...

  7. nginx 增加 lua模块

    Nginx中的stub_status模块主要用于查看Nginx的一些状态信息. 本模块默认是不会编译进Nginx的,如果你要使用该模块,则要在编译安装Nginx时指定: ./configure –wi ...

  8. 如何创建一个 Lua 模块

    如何创建一个 Lua 模块 翻译自: How to Create a Lua Module 译者: FreeBlues 正文 Lua编程语言 中的一个 模块(module)是一个包含函数和变量的代码片 ...

  9. Nginx使用Lua模块实现WAF

    前言:最近一段时间在写加密数据功能,对安全相关知识还是缺少积累,无意间接触到了WAF相关知识,刚好Nginx可以实现WAF功能,也简单学习了Lua这门语言,分享下 一.WAF产生的背景 过去企业通常会 ...

  10. python常用模块(模块和包的解释,time模块,sys模块,random模块,os模块,json和pickle序列化模块)

    1.1模块 什么是模块: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文 ...

随机推荐

  1. TCP/IP协议族-----24、网络管理(SNMP)

  2. linux zip压缩和解压的各种操控

    1.把/home文件夹以下的mydata文件夹压缩为mydata.zip zip -r mydata.zip mydata #压缩mydata文件夹 2.把/home文件夹以下的mydata.zip解 ...

  3. swift - UIToolbar 的用法

    代码如下: 1.声明及初始化 var toolsBar = UIToolbar() toolsBar.frame = CGRect(x:, y:, width:SCREEN_WIDTH, height ...

  4. java -jar Test.jar找不到main class问题

    如果你写了一些class,编 译到一个jar里面,但是在执行这个jar的时候报错,找不到main class,但是你明明是有的,是不是很郁闷,检查一下你的jar吧. 解压你的jar,打开META-IN ...

  5. git 提交代码出现git Permission to Xx denied to Xx 错误

    http://blog.csdn.net/chen_xi_hao/article/details/71172279

  6. mac 安装mysql 修改密码

    我草!!! 上网查资料,安装mysql,一大推废话,简直就是他妈的瞎扯淡,真是能他妈的瞎编,草! 为了不让后面的同学看到那些狗屁不通的资料,我把自己安装mysql的步骤,以及修改mysql密码的方法梳 ...

  7. windbg载入目标模块pdb

    .reload /f xxxx.dll ld xxxx 以kdcom为例子 .reload /f kdcom.dll ld kdcom 二选一

  8. 点击button,button背景图片变化

    1.设置背景渐变效果,在drawable目录下建buttonshape.xml文件, 内容为: <?xml version="1.0" encoding="utf- ...

  9. codereviw得到的一些经验

    1.设置display为none的元素,它的背景图依然会被下载.所以最好是等到该元素需要显示时才给他加上相应的有背景图的class. 2.css中虽然ID选择器的优先级比较高,效率也比较高,但灵活性差 ...

  10. eclipse 安装Subversion1.82(SVN)插件

    Eclipse下SVN插件的安装,可以选择在线安装和离线安装两种方式: 2.(可选①)使用本地安装包安装插件 --填写插件名(可随意取名) --插件来源地址(①安装包,②使用网址) →Archie→选 ...