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库详解** Lua是一种轻量级的脚本语言,因其简洁的语法和高效性在游戏开发、嵌入式系统以及配置管理等领域广泛应用。LUA library,即Lua的库,是提供给开发者用于扩展和增强Lua功能的一系列模块和函数集合。...
### Lua基础教程(十四)模块知识点详解 #### 一、模块的概念与作用 在Lua语言中,**模块**类似于一个库或工具集,通过`require`关键字进行加载,并且拥有一个全局名称,这个名称通常是一个表。模块可以包含多个...
3. **模块(Module)**:Lua 支持模块化编程,通过 `require` 加载其他 Lua 文件。 - 导入模块: ```lua local myModule = require('myModule') ``` #### 五、总结 Lua 作为一种轻量级脚本语言,非常适合用于快速...
### LUA轻松入门详解 #### 一、Lua简介 **Lua** 是一款轻量级的脚本语言,由标准C编写而成,因此具有很好的跨平台特性,可以在几乎所有操作系统和平台上进行编译和运行。Lua虽然体积小巧(一个完整的Lua解释器不...
### Lua基础教程合集知识点详解 #### 一、概览 **Lua**是一种轻量级、高效的脚本语言,常用于游戏开发、嵌入式系统等领域。本教程旨在为初学者提供一个全面的学习路径,从环境搭建到核心概念的讲解。 #### 二、...
在Web开发领域,Lua可以用于构建动态网站、Web服务以及复杂的Web应用。它不仅能够处理前端逻辑,还能实现后端业务逻辑,并且在性能方面表现出色。 #### 三、关键技术和框架 - **开普勒社区**:成立于2004年,致力...
Lua5.1版本开始,提供了require函数和module函数来支持模块化的编程。 require函数是Lua中加载模块的主要工具。在Lua中,模块本质上是一个包含函数和常量的表(table)。require函数通过模块名来加载模块,并返回一...
本文将深入探讨Lua环境下基本的网络编程实践,包括简单的服务器搭建过程以及相关的Web组件介绍。 #### 二、Lua Web编程框架与组件 ##### 1. Kepler 社区与Lua Web组件 - **背景**:Kepler社区成立于2004年,致力于...
5. **模块(Module)**:Lua没有内置的包管理器,但可以通过require函数加载模块。开发者可以自定义模块系统,以组织和重用代码。 6. **面向对象编程**:Lua支持面向过程和面向对象编程,通过元表可以实现类和对象...
**Lua脚本语言详解** Lua是一种轻量级的、可扩展的、动态类型的脚本语言,广泛应用于游戏开发、嵌入式系统、服务器配置等多个领域。`luaplus`是Lua的一个增强版本,它提供了对C++的更深入集成,增加了类、对象等...