Lua的require和module小结  module特性是lua5.1中新增的,用于设置Lua文件自己的模块,最常用的方式是module(name,package.seeall),有时候lua文件名和module设置的名字不一样,到底require的时候该 require文件名还是require模块(module)名了,今天自己试了一把  首先,如果在lua文件中不显示的require,那么lua运行环境会默认加载哪些呢? 可以通过遍历package.loaded数组来查看,包括以下  string  debug  package  _G  io  os  table  math  coroutine  新建了一个lua文件,取名为moduleB.lua,内容如下  ----------------moduleB.lua ------------------  module("module123",package.seeall)  function printB()   print('B')  end  为了试验,新建一个lua文件,随便取名为A.lua,首先require名试下。如果文件名和模块名不相同时,require模块名是正确的,那么module123.printB就可正常执行  ---------------A.lua:-------------------------  require "module123"  module123.printB()  执行的结果是,报错,错误如下  lua: printtt.lua:2: module 'module123' not found:  no field package.preload['module123']  no file '.\module123.lua'  no file 'C:\Program Files (x86)\Lua\5.1\lua\module123.lua'  no file 'C:\Program Files (x86)\Lua\5.1\lua\module123\init.lua'  no file 'C:\Program Files (x86)\Lua\5.1\module123.lua'  no file 'C:\Program Files (x86)\Lua\5.1\module123\init.lua'  no file 'C:\Program Files (x86)\Lua\5.1\lua\module123.luac'  no file '.\module123.dll'  no file '.\module12351.dll'  no file 'C:\Program Files (x86)\Lua\5.1\module123.dll'  no file 'C:\Program Files (x86)\Lua\5.1\module12351.dll'  no file 'C:\Program Files (x86)\Lua\5.1\clibs\module123.dll'  no file 'C:\Program Files (x86)\Lua\5.1\clibs\module12351.dll'  no file 'C:\Program Files (x86)\Lua\5.1\loadall.dll'  no file 'C:\Program Files (x86)\Lua\5.1\clibs\loadall.dll' stack traceback:  [C]: in function 'require'  printtt.lua:2: in main chunk  [C]: ?  既然require模块名报错,那么reqire文件名呢?如果require文件名是正确的,那么该以怎样的形式调用printB函数呢?  第一种:  -----------------------A.lua-----------------------  require "moduleB"  moduleB.printB()  第二种:  -----------------------A.lua-----------------------  require "moduleB"  module123.printB()  经过验证,第二种是正确的。即require时是文件名,而调用对应函数时,则使用模块(module)调用函数。为什么是这样的,这个取决于require的搜索机制:  1:require时首先去全局变量package.loaded查找模块是否被加载过。如果加载过直接返回,否则到2  2: 去package,preload中查找可适用于模块的加载器,一般是找不到的,转到3  3:到对应的目录找指定模块.lua文件,如果存在,则用loadfile加载文件,注意只是加载代码,而不是执行  4:如果没有对应的lua文件,则会去相应目录存在c程序库,如果存在,会用loadlib加载  那么寻找lua文件和c文件对应的默认路径是什么呢? 以windows为例,lua 5.1版本程序安装在C:\Program Files (x86)\Lua\5.1目录下,用PWD代替  寻找lua文件默认路为:   .\?.lua;PWD\lua\?.lua;PWD\lua\?\init.lua;PWD\?.lua;PWD\?\init.lua;PWD\lua\?.luac  寻找c程序库默认路径为:.\?.dll;.\?51.dll;PWD\?.dll;PWD\?51.dll;PWD\clibs\?.dll;PWD\clibs\?51.dll;PWD\loadall.dll;PWD\clibs\loadall.dll    综上所述,当lua文件名和模块module名不同时,应该require文件名,同时用模块module名来调用函数。      附:默认加载模块自带的函数  >lua -e "io.stdout:setvbuf 'no'" "wdw.lua" -----package.load---- string ---Enter --- table sub function: 0032A2F0 upper function: 0032A330 len function: 0032A1B0 gfind function: 0032A130 rep function: 0032A270 find function: 0032A070 match function: 0032A230 char function: 00329FF0 dump function: 0032A030 gmatch function: 0032A130 reverse function: 0032A2B0 byte function: 00329FB0 format function: 0032A0B0 gsub function: 0032A170 lower function: 0032A1F0 -----package.load---- debug ---Enter --- table getupvalue function: 0032B078 debug function: 0032AF58 sethook function: 0032B0B8 getmetatable function: 0032B058 gethook function: 0032AF98 setmetatable function: 0032B118 setlocal function: 0032B0F8 traceback function: 0032B158 setfenv function: 0032B098 getinfo function: 0032AFD8 setupvalue function: 0032B138 getlocal function: 0032B018 getregistry function: 0032B038 getfenv function: 0032AF78 -----package.load---- package ---Enter --- table preload table: 0042DC28 ----------------------- ----nil---- loadlib function: 0042EB88 loaded table: 00323360 ----------------------- ----nil---- loaders table: 0042DBD8 ----------------------- ----nil---- cpath .\?.dll;.\?51.dll;PWD\?.dll;PWD\?51.dll;PWD\clibs\?.dll;PWD\clibs\?51.dll;PWD\loadall.dll;PWD\clibs\loadall.dll config \ ; ? ! - path ;.\?.lua;PWD\lua\?.lua;PWD\lua\?\init.lua;PWD\?.lua;PWD\?\init.lua;PWD\lua\?.luac seeall function: 0042EBC8 -----package.load---- _G ---Enter --- table string table: 0042DEF8 ----------------------- ----nil---- xpcall function: 0042E8A8 printTable function: 0032C168 package table: 0042DBB0 ----------------------- ----nil---- tostring function: 0042E808 print function: 00327878 os table: 0042DE80 ----------------------- ----nil---- unpack function: 0042E868 require function: 0042ED88 getfenv function: 00327718 setmetatable function: 0042E7C8 next function: 003277F8 assert function: 003275F8 moduleB12345 table: 0032B8D8 ----------------------- ----nil---- tonumber function: 0042E7E8 io table: 0042DD40 ----------------------- ----nil---- rawequal function: 003278B8 collectgarbage function: 00327638 arg table: 0042E100 ----------------------- ----nil---- getmetatable function: 00327758 module function: 0042ED48 rawset function: 00327918 isTable function: 0032C148 math table: 0042DF70 ----------------------- ----nil---- debug table: 0042DFC0 ----------------------- ----nil---- pcall function: 00327838 table table: 0042DC50 ----------------------- ----nil---- newproxy function: 0042EFB0 type function: 0042E828 coroutine table: 0042DB10 ----------------------- ----nil---- _G table: 00321DE0 ----------------------- ----nil---- select function: 00327958 gcinfo function: 003276D8 pairs function: 0042EF80 rawget function: 003278D8 loadstring function: 003277D8 ipairs function: 0042EF50 _VERSION Lua 5.1 dofile function: 00327658 setfenv function: 0042E788 load function: 00327798 error function: 00327698 loadfile function: 00327778 _M table: 0032B8D8 ----------------------- ----nil---- _NAME moduleB12345 _PACKAGE  -----package.load---- io ---Enter --- table lines function: 00329278 write function: 003293D8 close function: 003291F8 flush function: 00329218 open function: 00329298 output function: 003292D8 type function: 003293B8 read function: 00329358 stderr file (74761BB8) stdin file (74761B78) input function: 00329238 stdout file (74761B98) popen function: 00329318 tmpfile function: 00329378 -----package.load---- os ---Enter --- table exit function: 003295B8 setlocale function: 00329ED0 date function: 00329518 getenv function: 003295F8 difftime function: 00329558 remove function: 00329638 time function: 00329EF0 clock function: 003294D8 tmpname function: 00329F30 rename function: 00329E90 execute function: 00329578 -----package.load---- table ---Enter --- table setn function: 00328ED8 insert function: 0042EF28 getn function: 0042EEA8 foreachi function: 0042EE88 maxn function: 0042EEE8 foreach function: 0042EE48 concat function: 0042EE08 sort function: 00328F18 remove function: 00328E98 -----package.load---- math ---Enter --- table log function: 0032AB98 max function: 0032ABD8 acos function: 0032A3F0 huge 1.#INF ldexp function: 0032AB18 pi 3.1415926535898 cos function: 0032A570 tanh function: 0032AE38 pow function: 0032AC98 deg function: 0032A5B0 tan function: 0032AE78 cosh function: 0032A530 sinh function: 0032AD78 random function: 0032AD18 randomseed function: 0032AD58 frexp function: 0032AAD8 ceil function: 0032A4F0 floor function: 0032A630 rad function: 0032ACD8 abs function: 0032A3B0 sqrt function: 0032ADF8 modf function: 0032AC58 asin function: 0032A430 min function: 0032AC18 mod function: 0032AA98 fmod function: 0032AA98 log10 function: 0032AB58 atan2 function: 0032A470 exp function: 0032A5F0 sin function: 0032ADB8 atan function: 0032A4B0 -----package.load---- coroutine ---Enter --- table resume function: 0042E9E8 yield function: 0042EAE8 status function: 0042EA68 wrap function: 0042EAA8 create function: 0042E9A8 running function: 0042EA28

Lua的require和module小结的更多相关文章

  1. Lua的require小结

    在游戏开发中会经常使用到lua作为游戏逻辑层的脚本语言,各种优势就不说了,虽然平时用的比较多,但对lua语言本身和内部的一些实现并不是很了解,让我们先从lua的require入手来一探require的 ...

  2. require、module、exports dojo中的三个特殊模块标识

    查看dojo源码过程中,发现这三个模块名并不以dojo.dijit.dojox开头,在dojo加载器中属于特殊模块名. require 这是一个上下文智能的加载器. 我们通过dojoConfig配置了 ...

  3. node源码详解(三)—— js代码在node中的位置,process、require、module、exports的由来

    本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/nodesource3 本博客同步在https://cnodejs.o ...

  4. nodejs -- require , exports , module

    1. require , exports . -------------------------- 文件: 1) index.js //两种方式都可以: var forExports = requir ...

  5. 【前端学习笔记】2015-09-09~~~~nodejs中的require()和module.exports

    nodejs中一个js文件就可以看做是一个模块 在node环境中,可以直接var a=require('模块路径以及不带扩展名的模块名') exports---module.exports 其中nod ...

  6. Node的require和module.exports

    node编程中最重要的思想之一就是模块,在 Node.js 模块系统中,每个文件都被视为独立的模块.这是这个思想,让javascript的大规模工程成为可能.模块化编程在前端大肆盛行,在node中导出 ...

  7. require exports module.exports

    require 用于引入模块(js文件). JSON.或本地文件 自己写的模块必须是相对路径,省略了node就认为该自定义模块(js文件)是核心模块(内置模块或者第三方模块) node  有模块作用域 ...

  8. Lua中的require

    lua中的require机制    为了方便代码管理,通常会把lua代码分成不同的模块,然后在通过require函数把它们加载进来.现在看看lua的require的处理流程.1.require机制相关 ...

  9. 【转载】lua中的require机制

    [转载自]http://blog.chinaunix.net/uid-552961-id-2736410.html lua中的require机制 为了方便代码管理,通常会把lua代码分成不同的模块,然 ...

随机推荐

  1. 对 Linux 新手非常有用的20个命令

    你打算从Windows换到Linux上来,还是你刚好换到Linux上来?哎哟!!!我说什么呢,是什么原因你就出现我的世界里了.从我以往的经验来说,当我刚使用Linux,命令,终端啊什么的,吓了我一跳. ...

  2. DSP28335矩阵键盘的检测

    #include "DSP2833x_Device.h"#include "DSP2833x_Examples.h"char temp;void gpio_in ...

  3. C6011 正在取消对 null 指针的引用

  4. CentOS安装Nexus(Maven私有库)详细配置及上传本地jar到私服

    Nexus原理 Maven的原理就是将jar从远程中央仓库下载到PC磁盘的本地仓库,当本地仓库没有发现需要的jar就会去Maven默认的远程中央仓库Maven Central(由Apache维护)中寻 ...

  5. c++函数内部声明函数,在函数外面实现函数是可以的

    这个具体有什么用我也不大清楚,只知道可以这样 #include <iostream> //#include "header1.h" using namespace st ...

  6. 移植net-snmp到开发板(mini210)

    1.安装交叉编译工具arm-linux-gcc 2.下载net-snmp源码安装包 3.解压安装包 4../configure --build=i686-linux --host=arm-linux ...

  7. Android -- 系统信息(内存、cpu、sd卡、电量、版本)获取

    内存(ram)                                                                              android的总内存大小信息 ...

  8. VIMTUTOR《VIM教程》

    =============================================================================== =      欢     迎     阅 ...

  9. 【反射】——Autofac 类型注册

    Autofac是.net界一款轻量化的IOC组件,使用Autofac可以帮助完成代码中很多依赖注入工作.在以前文章中,介绍过Autofac的配置过程(http://www.cnblogs.com/Jn ...

  10. 三星wep200蓝牙耳机中文说明书

    给耳机充电:耳机内部装有充电电池,第一次使用之前电一定要充满1,先将耳机放入所提供的充电盒中,关上盖.2,将配置器的接头插入充电盒的座孔内.并将另一端插入电源插座.*充电一直充到耳机指示灯由红变蓝*大 ...