L08. 模块与包
一. 什么是模块
1.模块类似于一个封装库, 从 Lua5.1开始,Lua 加入了标准的模块管理机制, 可以把一些公用的代码放在一个文件里,以 API 接口的形式在其他地方调用,有利于代码的重用和降低代码耦合度。
二. 加载模块
1. 使用require(模块名)加载模块
--方式1: require("模块名") --方式2: require"模块名" --方式3: local ret = require"模块名"
2. 加载机制
1. 对于自定义的模块,模块文件不是放在哪个文件目录都行,函数 require 有它自己的文件路径加载策略, 所有的'标准库'都是模块, lua提前自动加载的模块'所有标准库'--> math、string、...
2. 模块加载步骤
1). 当我们加载模块的时候首先先去package.loaded表中检查是否被加载过(package.loaded[module]是否有值) 如果有值的话直接返回, 所有重复加载同一个模块只会被加载1次, 如果有返回值, 则把第一次加载的返回值保存起来, 之后重复加载也是这个返回值
2). 如果package.loaded中没有此模块, 则会去全局变量package.path的指定路径中查找, 如果找到会调用loadfile加载此模块, loadfile加载完成后会返回一个函数, 则require函数内部会自动运行此函数, 如果有返回值则返回
3). 如果package.path中所有的路径没有找到此模块则会去path.cpath中所有的路径查找C包dll文件或so文件,如果找到则会调用package.loadlib加载此模块, , package.loadlib加载完成后会返回一个函数, 则require函数内部会自动运行此函数, 如果有返回值则返回
4) 如果没有找到则抛出错误信息
3. 环境变量
print(LUA_PATH) print(LUA_CPATH)
4. 修改查找(加载时搜索)的路径
--修改查找包文件路径 package.cpath = package.cpath .. ";.\\?.dll;.\\?.so" --修改查找lua模块文件路径 package.path = package.path .. ";.\\?.lua"