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

  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. Mac下的Parallel Windows忘记密码怎么办?

    Mac机上安装了Parallel Windows,日久年深不登录结果忘记了登录密码,百爪挠心,想破脑壳试了n个密码都不行,放了一个多月也没想起来. 今天没事网上溜溜,肯定也有和我同病相怜的弟兄,果然, ...

  2. Android 常用数据适配器ArrayAdapter

    接着上篇文章<Android 采用Layout Inflater创建一个View对象>,本文采用常用数据适配器ArrayAdapter 新建项目后,在layout文件夹下新建list_it ...

  3. C语言中qsort函数的应用

    qsort函数包含在<stdlib.h>的头文件里,本文中排序都是采用的从小到大排序 一.对int类型数组排序 ]; int cmp ( const void *a , const voi ...

  4. 安卓下如何使用JUnit进行软件测试

    软件测试作为程序员必备的一项技能是决定软件开发周期长短以及软件运行成败的关键,可以说好的软件不是代码写得好而是有效的测试决定的.本文将介绍在android下利用eclipse进行开发时如何使用JUni ...

  5. Mac OS X 删除文件快捷键

    今天发现自己还不知道怎么快捷的删除文件,网上找了下相关的资料. 原来删除文件的快捷键是:command+delete(把文件放到废纸篓),对于我这种笔记本用户,确实方便很多哈 还有一个命令也挺有用的: ...

  6. HTML和CSS高级指南——定位详解

    本文由大漠根据Shay Howe的<An Adavnced Guide to HTML & CSS>第二课<Detailed Positioning>所译,整个译文带有 ...

  7. JavaScript Patterns 6.6 Mix-ins

    Loop through arguments and copy every property of every object passed to the function. And the resul ...

  8. 搬家至独立博客 http://blog.imzjy.com

    欢迎访问 http://blog.imzjy.com

  9. HttpModule

    HttpModule是如何工作的 当一个HTTP请求到达HttpModule时,整个ASP.NET Framework系统还并没有对这个HTTP请求做任何处理,也就是说此时对于HTTP请求来讲,Htt ...

  10. OOP应用:实体类

    实体类 定义:实体类是一个业务实体的类,而业务实体就是整个软件系统业务所涉及的对象. 使用: 1.新增实体类项目,增加类库项目,以.Modes作为后缀. 2.抽取对象以及属性.(简单地说,对象就是每个 ...