lua require模块加载机制

2018-05-09 21:39:08

调用模块步骤

当我们调用require "modname"

1.会去检查package.loaded表格是否已经加载过,如果已经加载过直接返回,所以重复加载同一个模块多次只会加载1次

2.如果package.loaded表格没有此模块记录,则会到package.path指定的路径中搜索lua文件,如果找到则会调用loadfile加载,会返回一个函数(loader)。如果找不到lua文件,则会去package.cpath指定的路径中搜索动态库so文件,如果找到则会调用package.loadlib加载并寻找luaopen_modname函数(也就是loadfile的结果)。

3.不管是在lua文件中找到还是在动态库中找到,现在都已经有了一个loader加载器(函数)

4.此时,require调用加载器函数并传入2个参数(大多数模块会忽略参数),返回的任意值会存入package.loaded表格以便下次重复加载时直接返回。如果没返回值,也会当做有返回存入package.loaded(来避免下次重复加载时又白跑一遍2-4步骤)

如果想重复加载模块只需要执行

package.loaded[modname] = nil

那么下次再加载的时候,就会重复跑一遍2-4步骤


添加自定义搜索路径

-- 打印出当前默认搜索的动态库路径
-- ./?.so;/usr/lib64/lua/5.1/?.so;/usr/lib64/lua/5.1/loadall.so
print(package.cpath)

-- 添加默认搜索路径
package.cpath = '/home/lua/?.so;'..package.cpath

-- 打印出当前默认搜索的lua模块路径
-- ./?.lua;/usr/share/lua/5.1/?.lua;/usr/share/lua/5.1/?/init.lua;/usr/lib64/lua/5.1/?.lua;/usr/lib64/lua/5.1/?/init.lua
print(package.path)

-- 添加默认搜索路径
package.path = '/home/lua/?.lua;'..package.path


总结

1.本文只是对模块加载机制做简单的介绍,如果有疑问可以给我留言
2.lua的版本为5.1,运行环境centos7 64位
3.原文地址http://www.freecls.com/a/2712/13

©著作权归作者所有
收藏
推荐阅读
简介
天降大任于斯人也,必先苦其心志。