首页 > 代码库 > Lua的require和module小结

Lua的require和module小结

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小结