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. Python3.x List方法集合

    Python中的一个内置的基础类型叫List,类比于OC中的Array..他是有序的,那么下面写一些基础的方法,以备需要时候查阅: 1>获取List的长度 len(List) 2> 索引访 ...

  2. 将获得到的json赋值到下拉框

    $(function () { $.getJSON('handler/addEmployees.ashx', function (json) { alert(json.length); //遍历赋值 ...

  3. Oracle之sql追踪

    select * from v$sqlarea t where t.sql_text like '%_070%' order by t.LAST_ACTIVE_TIME desc SELECT * F ...

  4. python学习笔记1

    python3.3使用urllib2报错 no module named urllib2,原因是python3中将urllib2换成了request. 所以要使用import urllib.reque ...

  5. 技术揭秘12306改造(一):尖峰日PV值297亿下可每秒出票1032张

    [编者按]12306网站曾被认为是"全球最忙碌的网站",在应对高并发访问处理方面,曾备受网民诟病. 2015年铁路客票春运购票高峰期已过,并且12306网站今年没"瘫痪& ...

  6. 关于在 loadView 中改变状态栏的可视性

    这种问题不知道大家是否遇见过,在此用两句话(时间紧迫,还得加班)分享下今天犯的错误 我把状态栏的的可视性的改变写在了loadView 里面,然后就出现了调用了两次 loadView 和 viewDid ...

  7. postmortem report of period M1

    一.设想和目标 1.我们的软件主要要解决学长设计的学霸系统中视频及文档的浏览功能问题. 2.时间相对充裕.不过对于我们这些零基础的人来说还是比较困难. 3.我们团队中不同意见通常会进行进一步讨论,说出 ...

  8. Sprint计划会议1

    会议时间:4.15.晚9点 会议地点:学一食堂2楼 会议进程 • 首先我们讨论了实验第一个Sprint1要实现的功能(用户登录及信息录入).•  之后对任务进行了认领.•  最后每个人对自己的任务进行 ...

  9. C++输出四则运算设计题的思路

    一,(1)题目避免重复:使用srand(seed)函数进行随机化,随seed的不同,可以产生不同的随机数二,(1)控制数量:输入变量n控制三,(1)控制是否有乘除:(chengchu=0,没有乘除:c ...

  10. Linux常用命令查看日志

    cattail -f日 志 文 件 说 明 /var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一 /var/log/secure 与安全相关的日 ...