【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上为"\")

时间: 2024-10-13 14:10:31

【Lua】模块与包的相关文章

雷林鹏分享:Lua 模块与包

模块类似于一个封装库,从 Lua 5.1 开始,Lua 加入了标准的模块管理机制,可以把一些公用的代码放在一个文件里,以 API 接口的形式在其他地方调用,有利于代码的重用和降低代码耦合度. Lua 的模块是由变量.函数等已知元素组成的 table,因此创建一个模块很简单,就是创建一个 table,然后把需要导出的常量.函数放入其中,最后返回这个 table 就行.以下为创建自定义模块 module.lua,文件代码格式如下: -- 文件名为 module.lua -- 定义一个名为 modul

nginx多域名ssl证书以及lua模块的编译安装

#!/bin/bash #unzip zip&tar file function  untarfile(){ for i in $( ls . |grep -v .sh) do val=$(echo $i | grep ".zip$" |wc -l) if [[ "$val"  -eq  1 ]];then dirname=$(echo $i|sed "s/.zip//") if [[ ! -d $dirname ]];then echo

Lua语言基础汇总(11) -- Lua中的模块与包

前言 从Lua5.1版本开始,就对模块和包添加了新的支持,可是使用require和module来定义和使用模块和包.require用于使用模块,module用于创建模块.简单的说,一个模块就是一个程序库,可以通过require来加载.然后便得到了一个全局变量,表示一个table.这个table就像是一个命名空间,其内容就是模块中导出的所有东西,比如函数和常量,一个符合规范的模块还应使require返回这个table.现在就来具体的总结一下require和module这两个函数. require函

ngx lua模块源码简单解析

ngx lua模块源码简单解析分类: nginx 2014-07-11 11:45 2097人阅读 评论(0) 收藏 举报nginxlua数据结构架构目录(?)[+]对nginx lua模块的整个流程,原理简单解析.由于nginx lua模块相关配置,指令,API非常多,所以本文档只以content_by_lua指令举例说明. 读本文档最好配合读源码. 不适合对nginx和lua一点都不了解的人看.1.相关配置详细配置见 https://github.com/openresty/lua-ngin

2015/9/15 Python基础(12):模块和包

模块是用来组织 Python 代码的方法,而包则是用来组织模块的. 当代码量很大时,我们一般会把代码分成几个有组织的代码段,然后每个代码段之间有一定的联系.代码单之间是共享的,所以Python允许调入一个模块,允许使用其他模块的属性利用之前的工作成果,实现代码重用.那些自我包含并且有组织的代码片段就是模块(module),将其他模块中属性附加到你的模块中的操作较导入(import) 模块是逻辑上的说法,而它们在物理层是一个个独立的文件,模块的文件名就是模块的名字加拓展名.py.与其他可以导入类的

python 深入模块和包

模块可以包含可执行语句以及函数的定义. 这些语句通常用于初始化模块. 它们只在 第一次 导入时执行.只在第一次导入的时候执行,第一次.妈蛋的第一次...后面再次导入就不执行了. [1](如果文件以脚本的方式执行,它们也会运行.) 每个模块都有自己的私有符号表, 模块内定义的所有函数用其作为全局符号表. 被导入的模块的名字放在导入模块的全局符号表中. import 语句的一个变体直接从被导入的模块中导入名字到导入模块的符号表中. 例如: >>> >>> from fibo

Python 安装第三方库,模块和包的安装方法

在python中已经内置了很多的有用的模块,只要安装了python的开发工具,这些模块就可以立刻使用了.而在实际python开发的过程中,除了python内置的模块外,python还有大量的第三方的库.模块和包. 常用的第三模块都会在python的PyPI - the Python Package Index上进行注册,只要找到对应模块的名字就可以进行安装了. 由于最近需要通过python来创建PDF文档,但是由于python的内置模块中相关的模块,所以需要使用第三方的reportlab库来创建

Python的模块与包如何使用?

本文和大家分享的主要是python模块与包相关内容,一起来看看吧,希望对大家学习python有所帮助. 一.Python 模块简介 在开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在 Python 中,一个 .py 文件就称之为一个模块(Module). 之前我们学习过函数,知道函数是实现一项或多项功能的一段程序 .其实模

Python之路-模块和包

一.模块 1.定义:包含了Python定义和声明的文件,文件名就是模块名字加上.py后缀. import加载的模块分为四个类别: 1.Python编写的代码(.py文件) 2.已经被编译为共享库或DLL的C或C++扩展 3.包好一组模块的包 4.使用C编写并链接到Python解释器的内置模块 2. 导入模块执行过程: 1.执行源文件 2.产生一个源文件的全局名称空间 3.在当前位置拿到一个模块名,指向源文件的产生的名称空间. 3.导入模块的二种只用方式: 1.import导入模块示例: 2.fr

第四课 模块、包

nodejs 的模块.包 和java的包 C#的命名空间类似 那么nodejs中如何定义和使用呢 1 使用系统的模块 require('http') 和require('fs'); 就是使用require命令 参数是包名 2 自己定义自己的包或者模块 例如: 新建一个文件如: conver.js 里面的代码: function conver(str) { return parseInt(str); } exports.convert= convert; 第二个js文件 我起名为useage.js