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代码分成不同的模块,然 ...
随机推荐
- iOS学习之Object-C语言属性和点语法
一.属性 1.属性的声明:在.h文件中使用@property声明属性. @property NSString *name; 2.属性的作用是生成setter以 ...
- 【ASP.NET MVC 回顾】HtmlHepler应用-分页组件
以前在ASP.NET WebForm开发中会用到许多控件,像DropDownList等.同样ASP.NET MVC中也有类似的控件-HtmlHelper. HtmlHelper和服务器控件相比,Htm ...
- SharePoint 2010 RBS 安装和配置的一些记录
1.SharePoint 2010 RBS FILESTREAM Provider 的“垃圾收集”: 在SharePoint 中删除上传的文档RBS并不会在文件系统删除文档,理解只是在内容数据库删除了 ...
- 用MSBuild和Jenkins搭建持续集成环境(1)
http://www.infoq.com/cn/articles/MSBuild-1 你或其他人刚刚写完了一段代码,提交到项目的版本仓库里面.但等一下,如果新提交的代码把构建搞坏了怎么办?万一出现编 ...
- Google Volley: How to send a POST request with Json data?
sonObjectRequest actuallyaccepts JSONObject as body. From http://arnab.ch/blog/2013/08/asynchronous- ...
- Android -- Webview自适应屏幕
第一种 WebSett ...
- Linux 前台 和 后台进程 说明
一. 有关进程的几种常用方法 1.1 & 符号 在命令后面加上一个 & 符号,表示该命令放在后台执行,如: [oracle@singledb ~]$ crontab -l 20 17 ...
- 1. ProGit-起步
(1) 版本控制 本地式 大都是采用数据库记录文件的差异 典型的有rcs,主要保存并管理文件补丁,根据补丁去计算各版本文件内容 缺点:无法协同工作 集中式 通过一个单一的集中服务器去管理所有文件的修订 ...
- python 数据结构-列表
列表常用方法汇总: #定义列表li li=[12.23,456,88,9] a=[1,2,3] #添加元素到列表结尾 li.append(360) #追加列表元素extend(L) li.extend ...
- shell编程之分隔符
1 #!/bin/bash 2 line="root:x:0:0:root:/root:bin/bash" 3 oldIFS=$IFS 4 IFS=":" 5 ...