随笔 - 147  文章 - 5  评论 - 6  阅读 - 81225
  2014年12月28日

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名来调用函数。      

posted @ 2014-12-28 21:59 紫金树下 阅读(2697) 评论(0) 推荐(0) 编辑
  2014年10月8日
摘要: 参考安装指南:http://nginx.org/en/docs/configure.html 1.下载最新主线(mainline)代码nginx-1.7.6到/usr/local目录下解压 /usr/local$ tar -zxvf nginx-1.7.6.tar.gz 2.进入/usr/local 阅读全文
posted @ 2014-10-08 21:52 紫金树下 阅读(195) 评论(0) 推荐(0) 编辑
  2013年10月6日
摘要: 1.chkconfig是一个改变开机启动项的命令,修改/etc/rc[0-6].d文件夹下的内容2.chkconfig命令有5种不同的作用:增加新的服务、删除服务、打印当前开启启动服务的信息、修改开启启动服务的信息、检查一个指定服务的状态3.当chkconfig servicename时,它检查这个服务是不是在当前的runlevel下被开启启动,如果是,返回true,否则false。chkconfig --level= servicename检查服务是不是在指定的runlevel开机启动4.当chkconfig --list时,或者完全没有参数即chkconfig时,会列出当前的服务和他们的配 阅读全文
posted @ 2013-10-06 15:42 紫金树下 阅读(776) 评论(0) 推荐(0) 编辑
  2013年9月5日
摘要: http://blog.chinaunix.net/uid-22996709-id-3056078.html在win7上安装了SecurityCRT,登录VMWARE Fedora时候登录超时,检查了win7下的ip地址以及vm中fedora 中ip地址,确认是在同一个局域网下,可能是没有启动telnet服务。一、linux下查询telnet是否安装:[root@localhost ~]# rpm -qa | grep telnettelnet-0.17-38.fc7已安装。二、查询telnet-server 驱动是否已经安装[root@localhost ~]# ypm -qa | grep 阅读全文
posted @ 2013-09-05 12:00 紫金树下 阅读(385) 评论(0) 推荐(0) 编辑
  2013年8月27日
摘要: http://blog.csdn.net/wcyoot/article/details/6435906本题考查的是二进制编码问题。如对1000桶按1~1000编码,需要10位二进制数。因此只需要取10只老鼠,每只老鼠只喝其对应位数为1的编号的酒。即10只老鼠按以下编码:第一只 00000 00001第二只 00000 00010第三只 00000 00100第四只 00000 01000...第十只 10000 00000每只老鼠只喝其编码与酒编码做位与运算非0的酒。如果毒酒的编码在某一位为1,则监控该位的老鼠必喝,结果为1.即把10只老鼠的结果,按位填入一个10位二进制数中,其结果即为毒酒编 阅读全文
posted @ 2013-08-27 10:52 紫金树下 阅读(1696) 评论(0) 推荐(0) 编辑
  2013年8月20日
摘要: /* 龙舟比赛,这题每次把胜者的编号保存下来,然后对他们进行比较,知道只剩1个胜者 */#includeusing namespace std;int w[6][6] = { 0,1,2,3,0,0, 1,1,2,1,1,1, 2,2,2,2,2,2, 3,1,2,3,3,3, 0,1,2,3,4,5 }; int order[6]={1,3,4,2,0,5};int result[6]={-1};void play(int n){ /* 首先声明1... 阅读全文
posted @ 2013-08-20 15:44 紫金树下 阅读(229) 评论(0) 推荐(0) 编辑
摘要: /* 求1个矩阵中最大的二维矩阵 1。 单就这一题来说,首先方法就是遍历 */#includeusing namespace std;int a[][5]={{1,2,0,3,4}, {2,3,4,5,1}, {1,1,5,3,0}, };int m=3;int n=5;void max_matrix(void){ int i,j,k,s; int sum=-65535; for(i... 阅读全文
posted @ 2013-08-20 15:42 紫金树下 阅读(539) 评论(0) 推荐(0) 编辑
摘要: http://blog.csdn.net/v_july_v/article/details/6126444队列的应用场景为:一个生产者线程将int类型的数入列,一个消费者线程将int类型的数出列生产者消费者线程演示一个生产者线程将int类型的数入列,一个消费者线程将int类型的数出列#include #include #include #include #include using namespace std; HANDLE ghSemaphore; //信号量 const int gMax = 100; //生产(消费)总数 std::queue... 阅读全文
posted @ 2013-08-20 15:36 紫金树下 阅读(190) 评论(0) 推荐(0) 编辑
摘要: 题目: 给一个很长字符串,要求找到符合要求的字符串,例如目的串123,1***3***2,12****3这些都要找出来解: 这题的意思是,例如给定目的串S="abc",那么在这个很长的字符串中寻找子字符串,这个子字符串中满足S中的每个字符都要出现,并且S中的某一个字符只出现1次。设待匹配字串长度位n,模式字符串长度位m1。对待匹配字符串的每一个字符进行m次匹配,记录下S中每个字符出现个数,当个数都>=1时结束,此时是满足条件的1个子字符串,然后从这个子字符串的下一个字符开始匹配时间是O(m*n)2.hash的方法。对目的串hash,遍历待匹配字符串,对每个字符hash 阅读全文
posted @ 2013-08-20 15:34 紫金树下 阅读(338) 评论(0) 推荐(0) 编辑
  2013年8月16日
摘要: 1。http://www.cnblogs.com/HappyAngel/archive/2011/08/22/2149916.html2。http://blog.csdn.net/cjh1123/article/details/6579008 阅读全文
posted @ 2013-08-16 16:37 紫金树下 阅读(206) 评论(0) 推荐(0) 编辑
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示