子模块和包

简介: 子模块和包

Lua 语言支持具有层次结构的模块名,通过来分割名称中的层次。例如,一个名为 mod.sub 的模块是模块 mod 的一个子模块。一个包是一颗由模块组成的完整的树,它是 Lua 语言中用于发行程序的单位。


当加载一个名为mod.sub的模块时,函数 require 依次使用原始的模块名 "mod.sub" 作为键来查询表 package.loaded 和表 package.preload 。这里,模块名中的点像模块名中的其他字符一样,没有特殊含义。


然而,当搜索一个定义子模块的文件时,函数 require 会将点转换为另一个字符,通常就是操作系统的目录分隔符(例如, POSIX 操作系统的 / 或Windows操作系统的 \ )。转换后,函数 require 会向搜索其他名称一样搜索这个名称。例如,假设目录分隔符是 / 并且有如下路径:

./?.lua;/usr/local/lua/?.lua;/usr/local/lua/?/init.lua


调用 require "a.b" 会尝试打开以下文件:

  • ./a/b.lua
  • /usr/local/lua/a/b.lua
  • /usr/local/lua/a/b/init.lua


这种行为使得一个包中的所有模块能够放到一个目录中。例如,一个具有模块 pp.ap.b 的包对应的文件可以分别是 p/init.luap/a.luap/b.lua ,目录 p 又位于其他合适的目录中。


Lua 语言使用的目录分隔符是编译时配置的,可以是任意的字符串。例如,没有目录层次的系统可以使用下划线作为"目录分隔符",因此调用 require "a.b" 会搜索文件 a_b.lua


提示

Lua 并不知道目录的存在。


C 语言中的名称不能包含点,因此一个用 C 语言编写的子模块 a.b 无法导出函数 luaopen_a.b 。这时,函数 require 在加载 C 语言编写的子模块时还有另一个搜索器。当该函数找不到子模块对应的 Lua 文件或 C 文件时,它会再次搜索 C 文件所在的路径,不过这次将搜索包的名称。例如,如果一个程序要加载子模块 a.b.c ,搜索器或搜索文件 a 。如果找到了 C 标准库 a ,那么函数 require 就会在该库中搜索对应的加载函数 luaopen_a_b_c 。这中机制允许一个发行包将几个子模块组织为一个 C 标准库,每个子模块有各自的加载函数。


Lua 语言的视角看,同一个包中的子模块没有显式的关联。加载一个模块并不自动加载它的任何子模块。同样,加载子模块也不会自动加载其父模块。当然,只要包的实现者愿意,也可以创造这种关联。例如,一个特定的模块可能一开始就显式地加载它的一个或全部子模块。

目录
相关文章
|
28天前
|
前端开发 JavaScript
【最全最详细】publiccms实现将公共部分提取成单独模块引入
【最全最详细】publiccms实现将公共部分提取成单独模块引入
12 0
|
4月前
|
Java Maven
maven子模块无法继承父模块的jar包解决方案
maven子模块无法继承父模块的jar包解决方案
|
10月前
|
JSON 数据格式 Python
24.从入门到精通:__name__属性 dir() 函数 标准模块 包 从一个包中导入*
24.从入门到精通:__name__属性 dir() 函数 标准模块 包 从一个包中导入*
|
12月前
|
JavaScript
path 模块
path 模块
|
存储 Unix Shell
模块和包
在python中,每个python文件都可以作为一个模块,模块得名字就是文件得名字。也就是自定义模块名必须要符合标识符命名规则。
模块和包
|
Java 数据库
项目的模块以及每一个模块的作用
项目的模块以及每一个模块的作用
项目的模块以及每一个模块的作用
|
开发者 Python
导入模块的五种方法| 学习笔记
快速学习导入模块的五种方法
364 0
|
Java Maven
多模块之新建父模块项目
多模块之新建父模块项目
67 0
|
JavaScript
vue外部打包路径封装,公用文件(配置等)
根据需要,最近整理优化了一下以前的文章,关于vue在外部修改一些公共路径或者公共配置。因为脚手架已经出了3.0,所以我这里就分别写了两个版本的对应: [vue-cli2.x版本](https://www.jianshu.com/p/ceb34d41fe2b) [vue-cli3.0版本](https://www.jianshu.com/p/ed6ea9a4aeda) #### 更新 1、如果对你有帮助的话,记得给个赞赏加关注,鼓励一下。
190 0