首先需要明白,一般情况下,我们的定义的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的更多相关文章

  1. lua module package.seeall选项

    module 与 package.seeall http://blog.codingnow.com/2006/02/lua_51_module.html 使用 module("test&qu ...

  2. lua module环境探秘

    module 作用 module (name [, ···]) Creates a module. If there is a table in package.loaded[name], this ...

  3. Lua 学习之基础篇七<Lua Module,Package介绍>

    Lua 之Module介绍 包管理库提供了从 Lua 中加载模块的基础库. 只有一个导出函数直接放在全局环境中: [require]. 所有其它的部分都导出在表 package 中. require ...

  4. nginx install lua module

    #install luajit #http://luajit.org/download.html .tar.gz cd LuaJIT- make install PREFIX=/home/allen. ...

  5. Lua的require和module小结

    Lua的require和module小结  module特性是lua5.1中新增的,用于设置Lua文件自己的模块,最常用的方式是module(name,package.seeall),有时候lua文件 ...

  6. lua UT测试工具

    luaunit Luaunit is a unit-testing framework for Lua, in the spirit of many others unit-testing frame ...

  7. Lua标准库- 模块(Modules)

    Lua包库为lua提供简易的加载及创建模块的方法,由require.module方法及package表组成 1.module (name [, ···]) 功能:建立一个模块. module的处理流程 ...

  8. lua 模块与环境

    编写一个模块的最简单方法: -- complex.lua -- 模块实际上是一个表 complex = {} -- 定义模块函数 function complex.add(c1,c2) ... end ...

  9. OpenResty 简单编写一个Module

    使用 Lua module 来进行 Lua 代码的复用是推荐的做法.然后在用户代码中直接用require()来调用 module代码: local myTest = {} function myTes ...

随机推荐

  1. 使用nc命令传输文件和文件夹

    相比较常用的scp,nc命令传文件不需要建立ssh连接和输入密码,方便快捷:尤其是在只能用key登录的机器上: 传文件: 先在目标机器执行命令准备好接收(1221为任意可用端口) nc -l 1221 ...

  2. Java 中的多线程你只要看这一篇就够了

    引 如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个 ...

  3. 热扩容LVM形式的/(根)分区(无损增大、缩小LVM分区)

    警告! 本文为虚拟机环境,生产环境请务必在操作前优先备份重要数据! 再有,请确保所需扩充的分区为非进程占用分区 实验背景:当时规划系统分区时/(根)目录分配过小 实验目的 : 无损增大/(根)分区容量 ...

  4. ldap集成confluence

    confluence ldap配置跟jira ldap集成一样,请参考:https://www.cnblogs.com/imcati/p/9378668.html

  5. 20145208 蔡野 《网络对抗》Exp5 MSF基础应用

    20145208 蔡野 <网络对抗>Exp5 MSF基础应用 链接地址 主动攻击:利用ms08_067_netapi进行攻击 对浏览器攻击:MS10-002 对客户端攻击:adobe_to ...

  6. Installing Jenkins as a Windows service

    Install Jenkins as a Windows service NOTE: if you installed Jenkins using the windows installer, you ...

  7. Django框架(十) Django之模型进阶

    QuerySet对象 可切片 使用Python 的切片语法来限制查询集记录的数目 .它等同于SQL 的LIMIT 和OFFSET 子句. Entry.objects.all()[:5] # (LIMI ...

  8. 再谈fedora下的音乐和视频播放器的安装

    rpm包就相当于windows下的exe,已经是编译后的二进制代码,可以使用rpm命令或dnf install ???.rpm来安装 lnux下软件的安装跟windows不同, 后者要到处去找, 要做 ...

  9. 颠倒的价牌|2013年蓝桥杯A组题解析第四题-fishers

    颠倒的价牌 小李的店里专卖其它店中下架的样品电视机,可称为:样品电视专卖店. 其标价都是4位数字(即千元不等). 小李为了标价清晰.方便,使用了预制的类似数码管的标价签,只要用颜色笔涂数字就可以了(参 ...

  10. 设计模式总结(转自CS-Notes)

    转载地址:https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F ...