Lua的require机制

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

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

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

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

3.默认的package.searchers序列如下:

  • 查询package.preload[modname],如果有这个值,完工。通常返回为空
  • 查询package.path路径,如果有这个模块,完工
  • 查询package.cpath,如果有这个模块,完工

如果在加载或运行模块时有错误, 或是无法为模块找到加载器, require 都会抛出错误。

package.config

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

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

package.cpath

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

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

package.loaded

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

这个变量仅仅是对真正那张表的引用; 改变这个值并不会改变 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 使用的表。

时间: 2024-12-22 12:34:08

Lua的require机制的相关文章

【转载】lua中的require机制

[转载自]http://blog.chinaunix.net/uid-552961-id-2736410.html lua中的require机制 为了方便代码管理,通常会把lua代码分成不同的模块,然后在通过require函数把它们加载进来.现在看看lua的require的处理流程. 1.require机制相关的数据和函数    package.path:保存加载外部模块(lua中"模块"和"文件"这两个概念的分界比较含糊,因为这个值在不同的时刻会扮演不同的角色)的

Lua的require和module小结

Lua的require和module小结  module特性是lua5.1中新增的,用于设置Lua文件自己的模块,最常用的方式是module(name,package.seeall),有时候lua文件名和module设置的名字不一样,到底require的时候该 require文件名还是require模块(module)名了,今天自己试了一把  首先,如果在lua文件中不显示的require,那么lua运行环境会默认加载哪些呢? 可以通过遍历package.loaded数组来查看,包括以下  st

lua关于require和package.loaded常被忽略的故事

用require函数只能加载一次,因为它的特性是: 1.require函数会搜索目录加载文件 2.require会判断是否文件已经加载避免重复加载同一文件. 而这个特性二,虽然我们可能知道这两个特性,但是潜意识里面常常把这个特性二给忽视掉了. 直到哪天我们需要反复加载同一个lua文件,但是没有实现自己想要效果的时候,才会发现这个特性二的存在感特别强! 也许有的小伙伴,会有疑问,为什么要反复加载啊?加载一次不就能用了么? 当我有一些特殊的需求的时候,就可能会需要反复加载某个lua文件,例如我的文件

(zt)Lua的多任务机制——协程(coroutine)

原帖:http://blog.csdn.net/soloist/article/details/329381 并发是现实世界的本质特征,而聪明的计算机科学家用来模拟并发的技术手段便是多任务机制.大致上有这么两种多任务技术,一种是抢占式多任务(preemptive multitasking),它让操作系统来决定何时执行哪个任务.另外一种就是协作式多任务(cooperative multitasking),它把决定权交给任务,让它们在自己认为合适的时候自愿放弃执行.这两种多任务方式各有优缺点,前者固

理解dojo.require机制

转自:http://blog.csdn.net/dojotoolkit/article/details/5935844 Dojo 提供了一个非常强大的javascript控件库. 在使用dojo之前,用户基本上不需要具备任何基础知识. 你可以用script远程链接到dojo(dojo.js), 也可以把dojo.js下载到本地并用script标签加载. 如果你不太了解dojo, 可以参考一下如下资料: Dojo 1.4 Cheat Sheet Dojo Base Source Tree (1.4

Lua之元表机制

Lua的表本质其实是个类似HashMap的东西,其元素是很多的Key-Value对,如果尝试访问了一个表中并不存在的元素时,就会触发Lua的一套查找机制,也是凭借这个机制,才能够实现“面向对象”的. 举例说明: [plain] view plaincopyprint? tempTable = {} print(tempTable.memberA) --这里试图打印tempTable并不存在的成员memberA 执行结果:nil输出为nil的原因很简单,tempTable中并没有memberA这个

lua垃圾回收机制

一.检测lua内存泄漏: 注:使用“collectgarbage("collect")”,局部变量v被回收,my_list没有被回收. 注:局部变量v占用的内存被回收. 注:将my_list置为nil,使用“collectgarbage("collect")”可以回收. 总结一: 如何监测Lua的编程产生内存泄露: 1.       针对会产生泄露的函数,先调用collectgarbage("count"),取得最初的内存使用 2.      

lua require与module

一.模块机制module 1.什么是module 对于用户来说,一个module相当于一个so库.模块的主要目标是实现代码的共享. 2.如何编写module lua是通过table来实现模块的,典型的写法如下. local M = {}        ---- 通常是加local的,如果不加,则M默认注册到_G中,require后,即使不return也可以直接使用M.加了local是局部变量,需要显示的return一下. M.print = function(...) print(...) en

lua加载函数require和dofile

Lua提供高级的require函数来加载运行库.粗略的说require和dofile完成同样的功能但有两点不同: 1. require会搜索目录加载文件 2. require会判断是否文件已经加载避免重复加载同一文件. 由于上述特征,require在Lua中是加载库的更好的函数. require使用的路径和普通我们看到的路径还有些区别,我们一般见到的路径都是一个目录列表.require的路径是一个模式列表,每一个模式指明一种由虚文件名(require的参数)转成实文件名的方法.更明确地说,每一个