`

lua require 以及module详解

阅读更多
1.require 机制
require 是搜索文件并加载文件,(会避免加载同一个文件)其他同dofile一样,
require是根据模式列表带匹配查找文件的,
如 "?;./1/?.lua" require在搜索的时候会替换其中的?来进行搜索, 同时匹配的结果  比如require("hello")
那么require匹配的结果就是 1. hello 2. ./1/hello.lua
package.path  = "?;./1/?.lua"  require 根据package.path来进行匹配的
如果虚拟机启动到时候存在LUA_PATH 那么package.path = LUA_PATH 如果没有的话就会设置成 luaconf.h定义的默认值,即"?;?.lua"
ps:package.cpath 跟这个一样,用于加载C类库 路径用的是LUA_CPATH

2. require 处理流程
require(modulename)
1.在package.loaded检查,如存在的话就直接返回它的值
2.在package.preload 检查,如存在则作为loader,调用loader(L)返回
3.根据上述的package.path路径来搜索文件返回(加载的时候会运行加载的文件)
4.根据package.cpath查找c库
5.以第一个"."为分割,将模块名划分为:(main, sub)的形式,根据package.cpath查找main,如果存在,就加载该库并查询相应的接口:luaopen_main_sub,例如:先查找 hello库,并查询luaopen_hello_world接口
6.得到loder后,用modname作为唯一的参数调用该loader函数。当然参数是通过lua的栈传递的,所以loader的原型必须符合lua的规范:int LUA_FUNC(lua_State *L)
        
   ll_require会将这个loader的返回值符给package.loaded[modelname],如果loader不返回值同时 package.loaded[modelname]不存在时, ll_require就会把package.loaded[modelname]设为true。
注意:最后ll_reuqire把package.loaded [modelname]返回给调用者。
此时我再应用时遇到过,如果是require以及module搭配使用 一定要注意module(name)中的 name 必须=modulename  不然在module中没有返回值的情况 只会得到true
3.module的处理流程
module(name,c1,c2)
1.package.loaded[name]是一个table,table将作为一个mod(require加载的文件列表也放在这里)
2.name是一个table,此那么将变成一个mod
3.创建table:package.loaded[name] = {[name]=package.loaded[name], ["_NAME"]=name, ["_M"]=t, ["_PACKAGE"]=*name*(删除了最后的".XXXX"部分)}.   4.依次调用c1,c2:
      c1(mod), c2(mod),...
     
   5.将当前模块的环境设置为mod,同时把package.loaded[name] = mod (就是上述的table)
分享到:
评论

相关推荐

    LUA library

    **LUA库详解** Lua是一种轻量级的脚本语言,因其简洁的语法和高效性在游戏开发、嵌入式系统以及配置管理等领域广泛应用。LUA library,即Lua的库,是提供给开发者用于扩展和增强Lua功能的一系列模块和函数集合。...

    Lua 基础教程(十四)模块.pdf

    ### Lua基础教程(十四)模块知识点详解 #### 一、模块的概念与作用 在Lua语言中,**模块**类似于一个库或工具集,通过`require`关键字进行加载,并且拥有一个全局名称,这个名称通常是一个表。模块可以包含多个...

    Lua 语言入门

    3. **模块(Module)**:Lua 支持模块化编程,通过 `require` 加载其他 Lua 文件。 - 导入模块: ```lua local myModule = require('myModule') ``` #### 五、总结 Lua 作为一种轻量级脚本语言,非常适合用于快速...

    LUA 轻松入门

    ### LUA轻松入门详解 #### 一、Lua简介 **Lua** 是一款轻量级的脚本语言,由标准C编写而成,因此具有很好的跨平台特性,可以在几乎所有操作系统和平台上进行编译和运行。Lua虽然体积小巧(一个完整的Lua解释器不...

    lua基础教程合集,适合初学者

    ### Lua基础教程合集知识点详解 #### 一、概览 **Lua**是一种轻量级、高效的脚本语言,常用于游戏开发、嵌入式系统等领域。本教程旨在为初学者提供一个全面的学习路径,从环境搭建到核心概念的讲解。 #### 二、...

    Lua进阶教程(四)Web编程.pdf

    在Web开发领域,Lua可以用于构建动态网站、Web服务以及复杂的Web应用。它不仅能够处理前端逻辑,还能实现后端业务逻辑,并且在性能方面表现出色。 #### 三、关键技术和框架 - **开普勒社区**:成立于2004年,致力...

    Lua教程(十一):模块与包详解

    Lua5.1版本开始,提供了require函数和module函数来支持模块化的编程。 require函数是Lua中加载模块的主要工具。在Lua中,模块本质上是一个包含函数和常量的表(table)。require函数通过模块名来加载模块,并返回一...

    Lua下基本的网络编程示例

    本文将深入探讨Lua环境下基本的网络编程实践,包括简单的服务器搭建过程以及相关的Web组件介绍。 #### 二、Lua Web编程框架与组件 ##### 1. Kepler 社区与Lua Web组件 - **背景**:Kepler社区成立于2004年,致力于...

    GG

    5. **模块(Module)**:Lua没有内置的包管理器,但可以通过require函数加载模块。开发者可以自定义模块系统,以组织和重用代码。 6. **面向对象编程**:Lua支持面向过程和面向对象编程,通过元表可以实现类和对象...

    luaplus 整理

    **Lua脚本语言详解** Lua是一种轻量级的、可扩展的、动态类型的脚本语言,广泛应用于游戏开发、嵌入式系统、服务器配置等多个领域。`luaplus`是Lua的一个增强版本,它提供了对C++的更深入集成,增加了类、对象等...

Global site tag (gtag.js) - Google Analytics