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"

 

 

 

 

 


posted @ 2022-12-05 20:59  小书臣  阅读(45)  评论(0编辑  收藏  举报