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小结的更多相关文章
- Lua的require小结
在游戏开发中会经常使用到lua作为游戏逻辑层的脚本语言,各种优势就不说了,虽然平时用的比较多,但对lua语言本身和内部的一些实现并不是很了解,让我们先从lua的require入手来一探require的 ...
- require、module、exports dojo中的三个特殊模块标识
查看dojo源码过程中,发现这三个模块名并不以dojo.dijit.dojox开头,在dojo加载器中属于特殊模块名. require 这是一个上下文智能的加载器. 我们通过dojoConfig配置了 ...
- node源码详解(三)—— js代码在node中的位置,process、require、module、exports的由来
本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/nodesource3 本博客同步在https://cnodejs.o ...
- nodejs -- require , exports , module
1. require , exports . -------------------------- 文件: 1) index.js //两种方式都可以: var forExports = requir ...
- 【前端学习笔记】2015-09-09~~~~nodejs中的require()和module.exports
nodejs中一个js文件就可以看做是一个模块 在node环境中,可以直接var a=require('模块路径以及不带扩展名的模块名') exports---module.exports 其中nod ...
- Node的require和module.exports
node编程中最重要的思想之一就是模块,在 Node.js 模块系统中,每个文件都被视为独立的模块.这是这个思想,让javascript的大规模工程成为可能.模块化编程在前端大肆盛行,在node中导出 ...
- require exports module.exports
require 用于引入模块(js文件). JSON.或本地文件 自己写的模块必须是相对路径,省略了node就认为该自定义模块(js文件)是核心模块(内置模块或者第三方模块) node 有模块作用域 ...
- Lua中的require
lua中的require机制 为了方便代码管理,通常会把lua代码分成不同的模块,然后在通过require函数把它们加载进来.现在看看lua的require的处理流程.1.require机制相关 ...
- 【转载】lua中的require机制
[转载自]http://blog.chinaunix.net/uid-552961-id-2736410.html lua中的require机制 为了方便代码管理,通常会把lua代码分成不同的模块,然 ...
随机推荐
- 上传图片的回调函数,callback作为一个函数针对回调函数
Tool.ImageUpload = function (selector, callback) { /// <summary>图片上传</summary> /// <p ...
- c# Random Class usage
Random Usage sometimes, we hope to generate some random infor to manipulate our data structor. we ca ...
- ABAP文本编辑框操作
* 1.创建文本框 DATA: g_container TYPE REF TO cl_gui_custom_container, g_editor TYPE REF TO cl_gui_textedi ...
- 着色Test
1 2 3 4 5 6 7 8 9 10 def test: print "just a test" print "just a test" ...
- 从Java的角度理解前端框架,nodejs,reactjs,angularjs,requirejs,seajs
[前端神秘的面纱] 对后端开发来说,前端是神秘的, 眼花缭乱的技术,繁多的框架, 如果你还停留在前端等于只用jquery做开发,那么你out了, 本文从Java的角度简述下目前前端流行的一些框架. 水 ...
- 揭开NodeJS的神秘面纱!
一.NodeJS是什么? Node是一个服务器端JavaScript解释器.Node.js是一套用来编写高性能网络服务器的JavaScript包. 二.Node的目标是什么? Node 公开宣称的目标 ...
- Workaround for Markdown blogging platform that to use LaTeX
Here is a solution to solve the lack of LaTeX support: by using Codecogs API. For instance, if you n ...
- SPFA 原理剖析代码实现分析比较
算法简介 SPFA(Shortest Path Faster Algorithm)是Bellman-Ford算法的一种队列实现,减少了不必要的冗余计算. 算法流程 算法大致流程是用一个队列来进行维护. ...
- zoj 2760 How Many Shortest Path 最大流
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1760 Given a weighted directed graph ...
- BZOJ 2301 Problem b
AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=2301 冬令营听了莫比乌斯,这就是宋老师上课讲的例题咯[今天来实现一下] #include& ...