Lua的require机制

在Lua中,有模块这个定义,加载一个模块须要使用require函数,require是一个全局函数。html

require有两个写法require("modname")和require "modname"函数

1.首先require函数会查找package.loaded表,检测modname是否加载过,若是加载过,则再也不加载,若是没加载过,则继续ui

2.require加载模块的按照package.searchers序列的指引来查找加载器,使用另外一个全局函数loader()实现,PS:package.searchers序列能够需改lua

3.默认的package.searchers序列以下:spa

  • 查询package.preload[modname],若是有这个值,完工。一般返回为空
  • 查询package.path路径,若是有这个模块,完工
  • 查询package.cpath,若是有这个模块,完工

若是在加载或运行模块时有错误, 或是没法为模块找到加载器, require 都会抛出错误。3d

package.config 

一个描述有一些为包管理准备的编译期配置信息的串。 这个字符串由一系列行构成:code

  • 第一行是目录分割串。 对于 Windows 默认是 '\' ,对于其它系统是 '/' 。
  • 第二行是用于路径中的分割符。默认值是 ';' 。
  • 第三行是用于标记模板替换点的字符串。 默认是 '?' 。
  • 第四行是在 Windows 中将被替换成执行程序所在目录的路径的字符串。 默认是 '!' 。
  • 第五行是一个记号,该记号以后的全部文本将在构建 luaopen_ 函数名时被忽略掉。 默认是 '-'。

package.cpath

这个路径被 require 在 C 加载器中作搜索时用到。htm

Lua 用和初始化 Lua 路径 package.path 相同的方式初始化 C 路径 package.cpath 。 它会使用环境变量 LUA_CPATH_5_3 或 环境变量 LUA_CPATH 初始化。 要么就采用 luaconf.h 中定义的默认路径。字符串

package.loaded

用于 require 控制哪些模块已经被加载的表。 当你请求一个 modname 模块,且 package.loaded[modname] 不为假时, require 简单返回储存在内的值。get

这个变量仅仅是对真正那张表的引用; 改变这个值并不会改变 require 使用的表。

package.loadlib (libname, funcname)

让宿主程序动态连接 C 库 libname 。

当 funcname 为 "*", 它仅仅链接该库,让库中的符号都导出给其它动态连接库使用。 不然,它查找库中的函数 funcname ,以 C 函数的形式返回这个函数。 所以,funcname 必须遵循原型lua_CFunction 。

这是一个低阶函数。 它彻底绕过了包模块系统。 和 require 不一样, 它不会作任何路径查询,也不会自动加扩展名。 libname 必须是一个 C 库须要的完整的文件名,若是有必要,须要提供路径和扩展名。funcname 必须是 C 库须要的准确名字 (这取决于使用的 C 编译器和连接器)。

这个函数在标准 C 中不支持。 所以,它只在部分平台有效 ( Windows ,Linux ,Mac OS X, Solaris, BSD, 加上支持 dlfcn 标准的 Unix 系统)。

package.path

这个路径被 require 在 Lua 加载器中作搜索时用到。

在启动时,Lua 用环境变量 LUA_PATH_5_3 或环境变量LUA_PATH 来初始化这个变量。 或采用 luaconf.h 中的默认路径。 环境变量中出现的全部 ";;" 都会被替换成默认路径。

package.preload

保存有一些特殊模块的加载器

这个变量仅仅是对真正那张表的引用; 改变这个值并不会改变 require 使用的表。

相关文章
相关标签/搜索