[Lua]require 小结

原创 2018年04月14日 22:39:18

require

用法不赘述,加载过程

  • 查找package.loaded 确认目标模块是否加载过
  • 没加载过,则通过package.loaders 获取loader
  • 通过loader去加载目标模块

tip:

  • “ . ” 在require时会被替换为文件系统的分隔符,比如/,所以脚本所在的文件夹命名不能包含”.”
  • 加载一个lua文件时,整个lua文件会被当做一个代码块,然后执行,并且接收require(name)的参数name作为参数
文件test.lua  
require("test2")

文件test2.lua
print(...)

运行test.lua,会输出 "test2"

package.loaders

控制require如何加载一个module的表

表内的值是一个搜索函数,调用require时,会升序地调用所有搜索函数;

搜索函数找到module时会返回加载module的function,反之返回errstr or nil

搜索函数顺序:

  1. 从package.preload里查找 应用:可以在preload修改目标模块的加载方式。
  2. 从package.path(搜索路径)里找 ,热更新的原理就是通过设置搜索路径的优先级来实现的,优先加载update文件夹下的lua代码。如何设置呢?应该是按添加顺序吧(没试过)
  3. 从 package.cpath里找

    例如: 在package.cpath = “./?.so;./?.dll;/usr/local/?/init.so” 中查找foo

    查找顺序: ./foo.so, ./foo.dll, and /usr/local/foo/init.so
    找到后,会链接该库,并且在该库中调用入口函数,入口函数是luaopen_[moduleName],moduleName(此时是foo):

    - 如果moduleName包含".",那么入口函数则是用"_"代替,如foo.b 对应luaopen_foo_b。在导出C库给lua时,入口函数就是这么来的。
    - 如果包含"-",那么入口函数会抛弃前缀,如a-foo对应luaopen_foo。
    

4.
The fourth searcher tries an all-in-one loader. It searches the C path for a library for the root name of the given module. For instance, when requiring a.b.c, it will search for a C library for a. If found, it looks into it for an open function for the submodule; in our example, that would be luaopen_a_b_c. With this facility, a package can pack several C submodules into one single library, with each submodule keeping its original open function.

module

Creates a module.这个功能在5.2版本的lua中已经被去掉了。平时使用的情况也比较少。
具体细节可以参考云风的博客:
https://blog.codingnow.com/2018/04/lua_54_nil_in_table.html

module(name[,…])

1.如果package.loaded[name] 存在,则模块为这个

2.全局表中某个table名字是name,那这个表为module

3.都没有则创建一个新table:name,且package.loaded[name]也会被赋值为该表

4.module会把当前的表设置为当前函数的env;

5.如果name包含”.”,如”a.b”,那么会创建一个全局表a= {b={}},但是此时由于第4条,所有全局表在module之后的语句内都无法再访问之前的全局变量;
(想访问必须这样写module(“a.b”,package.seeall))

local print=print
local _G = _G
module("a.b",package.seeall)--如果没有package.seeall,name下面的getfenv会报错,因为找不到;
print(getfenv())
print(_G.a.b)    
两个是相同的,

lua require与module

一、模块机制module     1.什么是module 对于用户来说,一个module相当于一个so库。模块的主要目标是实现代码的共享。     2.如何编写module ...
  • bosswanghai
  • bosswanghai
  • 2016-12-24 15:50:48
  • 1309

Lua require 函数详解 (转)

require函数详解(转)  --------》》》  http://blog.sina.com.cn/s/blog_5a6f39cf01016yxs.html 贴原文如下 简介 require函数...
  • duke_geng
  • duke_geng
  • 2014-12-10 11:39:21
  • 1465

Lua的require使用

一.require的作用 1. 加载指定的模块,相当与#include作用类似,加载了该模块,那么就可已使用模块中的全局函数和全局数据(如表等等) 注:实际上require “xxx”后,会将xx...
  • qweewqpkn
  • qweewqpkn
  • 2015-10-11 19:13:55
  • 14772

lua 中 require

在lua 5.0 中require:       require的另一个功能是避免重复加载同一个文件两次。Lua保留一张所有已经加载的文件的列表(使用table保存)。如果一个加载的文件在表中存在re...
  • yys213
  • yys213
  • 2011-06-23 11:09:00
  • 2530

Lua中的require

主要翻译自lua文档,加上了programming lua中自己的一些理解 require(modname) 加载给定的模块.函数首先检查表package.loaded来判定modname是否已经存在...
  • aisajiajiao
  • aisajiajiao
  • 2014-02-17 13:17:08
  • 34817

quick源文件中关于import和require的区别

载入一个模块 import() 与 require() 功能相同,但具有一定程度的自动化特性。 假设我们有如下的目录结构: ~~~ app/ app/classes/ app/clas...
  • u012723995
  • u012723995
  • 2014-10-25 19:13:06
  • 5769

重写require使lua文件模块化

lua文件模块化目标: 没有声明local的变量不会加入到全局变量,而是作为模块的变量 访问模块变量一律使用 "模块名.变量名"的形式 模块中使用显示的方式访问全局变量 ...
  • oracleot
  • oracleot
  • 2014-02-20 22:55:22
  • 6456

lua的require

Lua加载模块
  • for_tech
  • for_tech
  • 2016-07-21 10:59:46
  • 1822

lua中的用require不会循环引用

可以把所有头文件都require写在一个Lib文件中,从而可以以后再不同的lua文件中都可以访问到其它lua文件,这比c++可以说方便多了。...
  • themagickeyjianan
  • themagickeyjianan
  • 2016-05-05 11:33:05
  • 1240

cocos2dx lua的require、读取和执行顺序

今天就来研究一下,lua中的全局函数(function a()),本地函数(local function aa()),和require的功能(lua模块化和执行顺序),了解了这个,基本上lua程序上就...
  • CDAmber
  • CDAmber
  • 2015-03-28 23:07:46
  • 2581
收藏助手
不良信息举报
您举报文章:[Lua]require 小结
举报原因:
原因补充:

(最多只允许输入30个字)