编写一个模块的最简单方法:

  1. -- complex.lua
  2. -- 模块实际上是一个表
  3. complex = {}
  4. -- 定义模块函数
  5. function complex.add(c1,c2) ... end
  6. -- 调用模块内部的函数,需要complex.前缀
  7. function complex.callAdd(c1,c2)
  8. complex.add(c1,c2)
  9. end
  10. -- 之前的声明把所有函数都放入complex表中了,最后返回这个表
  11. return complex


调用这个模块时:
  1. -- main.lua
  2. local complex = require("complex")
  3. complex.add(x,y)

上述代码有几点麻烦:
1.在模块内部,一个函数调用另一个函数时,必须加上complex前缀
2.最后必须返回complex这个表

改进的办法:
  1. -- complex.lua
  2. -- 模块实际上是一个表,这里从require的参数(...)获取模块名称
  3. local modName = ...
  4. -- 模块的内部名称M
  5. local M = {}
  6. -- lua的全局变量默认存储地方为_G, _G[modName] = M 等价于定义一个名字为modName的全局变量
  7. _G[modName] = M
  8. -- require函数当一个函数无返回值的时候,会返回package.loaded[模块名]的值
  9. -- 于是这样写就可以省去最后的return语句了
  10. package.loaded[modName] = M
  11. -- setfenv是lua版本的using namespace M,这样写就可以避免每次都加M.前缀了
  12. -- 为了能够访问其他全局变量,把M的元表的__index字段设为_G,这样不在M表的函数和变量就会到_G表查找
  13. setmetatable(M, {__index = _G})
  14. setfenv(1,M)
  15. -- 定义模块函数,注意,模块名称被省略
  16. function add(c1,c2) ... end
  17. -- 调用模块内部的函数,需要complex.前缀
  18. function callAdd(c1,c2)
  19. add(c1,c2)
  20. end
  21. -- 不用返回这个表
  22. -- return M

上述的代码好麻烦,lua5.1提供了一个函数,完成等价功能,只需要这样写:
  1. -- complex.lua
  2. -- module等价于上述一大段函数, package.seeall让这个模块可以访问_G中的变量
  3. -- 如果只调用mudule(...)就不能访问
  4. module(..., package.seeall)
  5. -- 定义模块函数,注意,模块名称被省略
  6. function add(c1,c2) ... end
  7. -- 调用模块内部的函数,需要complex.前缀
  8. function callAdd(c1,c2)
  9. add(c1,c2)
  10. end
  11. -- 不用返回这个表
  12. -- return M


lua 模块与环境的更多相关文章

  1. 【Lua】Debian环境下openresty的安装

    OpenResty (也称为 ngx_openresty)是一个全功能的 Web 应用服务器,它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项. OpenResty 通 ...

  2. 在cocos code ide的基础上构建自己的lua开发调试环境

    对于一种语言,其所谓开发调试环境, 大体有以下两方面的内容: 1.开发, 即代码编写, 主要是代码提示.补齐, 更高级一点的如变量名颜色等. 2.调试, 主要是运行状态下断点.查看变量.堆栈等. 现在 ...

  3. lua 模块

    lua 模块 概述 lua 模块类似于封装库 将相应功能封装为一个模块, 可以按照面向对象中的类定义去理解和使用 使用 模块文件示例程序 mod = {} mod.constant = "模 ...

  4. nginx 增加 lua模块

    Nginx中的stub_status模块主要用于查看Nginx的一些状态信息. 本模块默认是不会编译进Nginx的,如果你要使用该模块,则要在编译安装Nginx时指定: ./configure –wi ...

  5. 安装Nginx+Lua+OpenResty开发环境配置全过程实例

    安装Nginx+Lua+OpenResty开发环境配置全过程实例 OpenResty由Nginx核心加很多第三方模块组成,默认集成了Lua开发环境,使得Nginx可以作为一个Web Server使用. ...

  6. 使用openresty + lua 搭建api 网关(一)安装openresty ,并添加lua模块

    openresty 有点不多说,网上各种介绍,先安装吧. 官方操作在此,http://openresty.org/cn/installation.html, tar -xzvf openresty-V ...

  7. Step By Step(Lua模块与包)

    Step By Step(Lua模块与包) 从Lua 5.1开始,我们可以使用require和module函数来获取和创建Lua中的模块.从使用者的角度来看,一个模块就是一个程序库,可以通过requi ...

  8. Nginx使用Lua模块实现WAF

    前言:最近一段时间在写加密数据功能,对安全相关知识还是缺少积累,无意间接触到了WAF相关知识,刚好Nginx可以实现WAF功能,也简单学习了Lua这门语言,分享下 一.WAF产生的背景 过去企业通常会 ...

  9. 【转载】cocos2d-x教程 Mac系统下搭建Lua的编码环境

    原文链接:http://blog.csdn.net/u012945598/article/details/17168831   在使用Lua写脚本的时候大家都会因为没有代码提示导致敲代码的效率有所下降 ...

随机推荐

  1. AFNetworking二次封装的那些事

    AFNetworking可是iOS网络开发的神器,大大简便了操作.不过网络可是重中之重,不能只会用AFNetworking.我觉得网络开发首先要懂基本的理论,例如tcp/ip,http协议,之后要了解 ...

  2. 【工具相关】iOS-Reveal的使用

    一,首先下载Reveal工具. Reveal的下载地址:http://revealapp.com/download. 下载界面如下图所示,选择Download Trail蓝色按钮可以进行下载: 二,新 ...

  3. redis数据类型

    Redis 数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). String(字符串) st ...

  4. C#程序猿电脑重装记录

    最近比较空了,闲的手痒,将自己的笔记本进行了重装,之前每次重装都没有记录,这次将本次重装过程记录下来,以便下次参考 1 首先不用说了WIN7旗舰版装好,驱动装好 2 开启Administrator用户 ...

  5. Web端即时通讯技术原理详解

    前言 有关IM(InstantMessaging)聊天应用(如:微信,QQ).消息推送技术(如:现今移动端APP标配的消息推送模块)等即时通讯应用场景下,大多数都是桌面应用程序或者native应用较为 ...

  6. JMS发布/订阅消息传送例子

    前言 基于上篇文章"基于Tomcat + JNDI + ActiveMQ实现JMS的点对点消息传送"很容易就可以编写一个发布/订阅消息传送例子,相关环境准备与该篇文章基本类似,主要 ...

  7. 从MVC框架看MVC架构的设计

    尽管MVC早已不是什么新鲜话题了,但是从近些年一些优秀MVC框架的设计上,我们还是会发现MVC在架构设计上的一些新亮点.本文将对传统MVC架构中的一些弊病进行解读,了解一些优秀MVC框架是如何化解这些 ...

  8. 磁带机Media is unrecognized

    早晨检查磁带备份作业时,发现有个驱动的作业一直处于"Queue"状态,检查发现驱动有磁带,在Alert里面发现出现下面"Media is unrecognized&quo ...

  9. HTML制作个人简历

    简历代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...

  10. SharePoint Content Database简介

    SharePoint作为微软主打的企业Portal平台,功能强大,使用简单,非常的方便.对于很多关系数据,我们可以使用自定义列表来维护,如果是非关系数据,可以使用文档库来维护.另外还可以在上面进行版本 ...