lua --- Module
首先需要明白,一般情况下,我们的定义的lua模块的文件与模块名(其实就是table的名字)是一致的,当然,不一致代码也是可以编译的(亲测),之所以这样,本人认为是为了实际项目中管理的方便。以下是定义模块的集中方式(文件名字是 GameMudle.lua):
方式一:
GameModule = {};
function GameModule.ShowName()
print("fun : ShowName");
end
function GameModule.ShowInfo()
print("fun : ShowInfo");
end
return GameModule;
假如有一天,我们想要修改模块的名字了,就需要逐行代码的去修改对应的模块名字,显然,这实际非常不合理的。
以下是调整过的一种定义方式:
GameModule = {};
local this = GameModule;
function this..ShowName()
print("fun : ShowName");
end
function this.ShowInfo()
print("fun : ShowInfo");
end
return this;
这样的话,每次修改模块的名字,我们只需要去修改第一行和第三行就可以了。但是还有一个问题,就是开始提到的,为了工程管理的方便,模块所在的lua文件名字与模块名需要保持一致,这样的话,我们没次更改模块名字,
需要同时修改模块名和模块所在的lua文件名,思考一下还有更好的定义模块的方式吗?显然是有的(哈哈哈。。。)。
以下是另外一种定义模块的方式:
local this = {};
local moduleName = ...; --传递模块名,可以理解为文件名
_G[moduleName] = this; --将全局环境设置为 this
function this.ShowName()
print("fun : ShowName");
end
function this.ShowInfo()
print("fun : ShowInfo");
end
return this;
进一步简化:
local this = {};
local moduleName = ...; --传递模块名,可以理解为文件名
_G[moduleName] = this; --将全局环境设置为 this,环境其实可以理解为一个表
setmetatable(this,{__index = _G}) --没有这一句,全局的 print 等内置函数将不能使用
setfenv(, this) --创建一个非全局环境 ,防止在全局环境中方法等命名的冲突,这里改变的是运行环境
--全局环境设置为 this ,于是,我们直接定义函数的时候,不需要再带 this 前缀。
--因为此时的全局环境就是M,不带前缀去定义变量,就是全局变量,这时的全局变量是保存在 this 里。
function ShowName()
print("fun : ShowName");
end
function ShowInfo()
print("fun : ShowInfo");
end
利用 module 函数进一步简化模块的定义:
module(..., package.seeall);
function ShowName()
print("fun : ShowName");
end function ShowInfo()
print("fun : ShowInfo");
end
调用方式:

lua --- Module的更多相关文章
- lua module package.seeall选项
module 与 package.seeall http://blog.codingnow.com/2006/02/lua_51_module.html 使用 module("test&qu ...
- lua module环境探秘
module 作用 module (name [, ···]) Creates a module. If there is a table in package.loaded[name], this ...
- Lua 学习之基础篇七<Lua Module,Package介绍>
Lua 之Module介绍 包管理库提供了从 Lua 中加载模块的基础库. 只有一个导出函数直接放在全局环境中: [require]. 所有其它的部分都导出在表 package 中. require ...
- nginx install lua module
#install luajit #http://luajit.org/download.html .tar.gz cd LuaJIT- make install PREFIX=/home/allen. ...
- Lua的require和module小结
Lua的require和module小结 module特性是lua5.1中新增的,用于设置Lua文件自己的模块,最常用的方式是module(name,package.seeall),有时候lua文件 ...
- lua UT测试工具
luaunit Luaunit is a unit-testing framework for Lua, in the spirit of many others unit-testing frame ...
- Lua标准库- 模块(Modules)
Lua包库为lua提供简易的加载及创建模块的方法,由require.module方法及package表组成 1.module (name [, ···]) 功能:建立一个模块. module的处理流程 ...
- lua 模块与环境
编写一个模块的最简单方法: -- complex.lua -- 模块实际上是一个表 complex = {} -- 定义模块函数 function complex.add(c1,c2) ... end ...
- OpenResty 简单编写一个Module
使用 Lua module 来进行 Lua 代码的复用是推荐的做法.然后在用户代码中直接用require()来调用 module代码: local myTest = {} function myTes ...
随机推荐
- 树莓派安装cobbler,自动化安装CentOS
安装python.相关python模块.apache sudo apt-get install python python2.7 python-django python-netaddr python ...
- ReentrantLock$Sync.tryRelease java.lang.IllegalMonitorStateException
早上一来,例行性的看主要环境的运行情况,发现有个环境中有如下异常: 17-02-28 08:13:37.368 ERROR pool-2-thread-65 com.ld.net.spider.Spi ...
- 详解重定向(HTTP状态码301/302/303/307/408)附例子
本文为原创文章,转载请注明出处. 今天打算好好把状态码301.302.303.307.308好好撸一遍,并会测试下一些例子. 状态码的解释 我们都知道重定向与这几种状态码有关,来看下这几种HTTP状态 ...
- NSIS+Duilib 制作Windows安装包
转载:https://www.cnblogs.com/zzllily/articles/5443850.html 转载:https://blog.csdn.net/bruce135lee/articl ...
- Jbarcode 条形码生成工具
一.准备jar包 https://sourceforge.net/projects/jbcode/?source=typ_redirect 二.编写工具类 package com.example.de ...
- repo forall -c 用法【转】
本文转载自:https://blog.csdn.net/u010164190/article/details/78332484 .repo forall命令 # repo forall -help # ...
- Mac通过安装Go2Shell实现“在当前目录打开iTerm2”
先上效果图: 1.从官网下载最新的版本,不要从苹果商店下载,因为苹果商店的版本比较旧,只支持Finders10.6~10.10,不支持最新的版本 http://zipzapmac.com/Go2She ...
- 解决/var/log下没有messages文件的问题?
fedora23和centos7+ 都是使用的 systemd 来代替sysv 管理系统启动和服务了. 在systemd 中主要包含两个方面的内容, 当打开/etc/inittab 文件时, 会看到: ...
- 【做题】51NOD1753 相似子串——哈希
题意:两个字符串相似定义为: 1.两个字符串长度相等 2.两个字符串对应位置上至多有一个位置所对应的字符不相同 给定一个字符串\(s\),\(T\)次询问两个子串在给定的规则下是否相似.给定的规则指每 ...
- sudo用法记录
使用root用户,visudo命令(实际是编辑/etc/sudoers文件),用法和vim一样,末行模式:wq退出,如还有提示,使用大写"Q"保存退出,小写"e" ...