在Lua中创建一个模块最简单的方法是:创建一个table。

并将所有需要导出的函数放入其中,最后返回这个table。

下例中的inv声明为程序块的局部变量,就是将其定义成一个私有的名称:

  1. local M = {}
  2. function M.new(r,i) return {r = r,i=i} end
  3. --defines constant 'i'
  4. M.i = M.new(,)
  5. function M.add(c1,c2)
  6.   return M.new(c1.r + c2.r,c1.i + c2.i)
  7. end
  8.  
  9. function M.sub(c1,c2)
  10.   return M.new(c1.r - c2.r,c1.i - c2.i)
  11. end
  12.  
  13. function M.mul(c1,c2)
  14.   return M.new(c1.r*c2.r - c1.i*c2.i, c1.r * c2.i + c1.i * c2.r)
  15. end
  16.  
  17. local function inv(c)
  18.   local n = c.r^ + c.i^
  19.   return M.new(c.r/n,-c.i/n)
  20. end
  21.  
  22. function M.div(c1,c2)
  23.   return M.mul(c1,inv(c2))
  24. end
  25.  
  26. function M.tostring(c)
  27.   return "(" .. c.r .. "," .. c.i .. ")"
  28. end
  29. return M

有的人不喜欢最后的return语句,可以通过下面的方法消除它:

  1. local M = {}
  2. package.loaded[...] = M
  3. < as before >

require调用加载器时,会把模块名作为第一个参数传递给它。因此上面的"..."表达式就是模块名。

通过这样的赋值后,就不需要在模块结尾返回M了,如果一个模块无返回值,require就会返回package.loaded[modname]的当前值(如果不为nil)。

不过写return语句,会显得更简洁一些。

另一种写模块的方式是在模块中把所有函数定义为局部变量,最后在返回的时候建立table。

  1. local function new(r,i) return {r = r , i = i } end
  2. -- defines constant 'i'
  3. local i = complex.new(,)
  4. < other functions follow the same pattern >
  5.  
  6. return {
  7. new = new,
  8. i = i,
  9. add = add,
  10. sub = sub,
  11. mul = mul,
  12. div = div,
  13. tostring = tostring,
  14. }

优点:不需要在每次调用函数时用M去调用;有一个清晰的导出列表;在模块里使用内部函数和外部函数都是一样的调用方法。

缺点:写在文件的最后不利于快速阅读代码;导出列表显得有点多余,必须写两次名字;

不过使用第二种方法,还有一个好处是可以让函数在模块内外有不同的名字。

不管用哪种方式,只要能用标准的方法调用就行。

以上内容来自:《Lua程序设计第二版》和《Programming in Lua  third edition 》

Chapter 15_2 编写模块的基本方法的更多相关文章

  1. 数据挖掘_requests模块的post方法

    前面已经跟大家讲了requests模块的get方法,这一篇文章我们要介绍的是requests模块中的另一个比较常用的方法,post方法 post方法的形式相比于get要复杂一些,这时因为post在提交 ...

  2. python开发_常用的python模块及安装方法

    adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheetahcherrypy:一个WEB frameworkctype ...

  3. 常用的python模块及安装方法

    adodb:我们领导推荐的数据库连接组件 bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheetahcherrypy:一个WEB frameworkctyp ...

  4. <五>JDBC_利用反射及JDBC元数据编写通用的查询方法

    此类针对javaBean类写了一个通用的查询方法,List<javaBean> 通用查询更新中...:通过学习,深刻体会到学会反射就等于掌握了java基础的半壁江山! 一.使用JDBC驱动 ...

  5. Python中optionParser模块的使用方法[转]

    本文以实例形式较为详尽的讲述了Python中optionParser模块的使用方法,对于深入学习Python有很好的借鉴价值.分享给大家供大家参考之用.具体分析如下: 一般来说,Python中有两个内 ...

  6. JDBC学习笔记(5)——利用反射及JDBC元数据编写通用的查询方法

    JDBC元数据 1)DatabaseMetaData /** * 了解即可:DatabaseMetaData是描述数据库的元数据对象 * 可以由Connection得到 */ 具体的应用代码: @Te ...

  7. Chapter 13. Miscellaneous PerlTk Methods PerlTk 方法杂项:

    Chapter 13. Miscellaneous PerlTk Methods PerlTk 方法杂项: 到目前为止,这本书的大部分章节 集中在特定的几个部件, 这个章节覆盖了方法和子程序 可以被任 ...

  8. 【转】JDBC学习笔记(5)——利用反射及JDBC元数据编写通用的查询方法

    转自:http://www.cnblogs.com/ysw-go/ JDBC元数据 1)DatabaseMetaData /** * 了解即可:DatabaseMetaData是描述数据库的元数据对象 ...

  9. IIS发布网站浏览之后看到的是文件目录 & Internal Server Error 处理程序“ExtensionlessUrlHandler-ISAPI-4.0_64bit”在其模块列表中有一个错误模块“IsapiModule” 解决方法 & App_global.asax.pduxejp_.dll”--“拒绝访问。 ”

    Q:IIS发布网站浏览之后看到的是文件目录 A:它出现了一个说到.NET4.0 更高框架什么的错误,所以我将 .NTE CRL版本由4.0改为2.0了,改为2.0后就出现了只能浏览文件目录了.改为4. ...

随机推荐

  1. ios之极光推送消息收到以后对消息的处理总结

    当我们的APP收到推送消息后,通常需要根据推送内容点击消息进入到指定的页面 这里讲一下收到推送消息后的处理,分为三种情况 :1.APP处于前台运行情况下     2.APP处于后台挂起情况下   3. ...

  2. [安全学习环境]Win7 下DVWA安装指南

    一.环境依赖: .Net Framework 3.5 PHP+MySQL 集成测试环境:XAMPP V3.2.1 二.环境准备 1.下载XAMPP(http://www.wampserver.com/ ...

  3. .net XML操作

    一.常规介绍 //初始化一个xml对象 XmlDocument xml = new XmlDocument(); //加载xml文件 xml.Load("文件路径"); //读取指 ...

  4. jQuery中操作Ajax方法小结

    有时候,越深入去了解一个点,越发觉得自己无知,而之前当自己晓得一两个片面的点还洋洋自得,殊不知,这是多么讽刺 jQery对Ajax操作进行了封装,常见的 ajax()属于最底层的方法,使用频率很高的 ...

  5. css基础和心得(二)

    css中的某些样式是具有继承性的.它允许样式不仅应用于某个特定html标签元素 而且应用于其后代.如: p{color:red;}  <p>dsffd<spans>sdfasd ...

  6. 《C++反汇编与逆向分析技术揭秘》——流程控制语句的识别

    if...else...语句 示例: if构成多分支语句 switch 有序线性的switch: 3E82D8位置存放了一个表,标明了要跳转到的地址: 这里的每四字节都标明的是每个case块的首地址: ...

  7. tablesorter周边文档

    一.简介: Tablesorter​作用于一个标准的HTML表格(有THEAD,TBODY),实现静态排序:主要特点包括: (1) 多列排序: (2) 支持文本.URI地址.数值.货币.浮点数.IP地 ...

  8. IIS 支持 ajax 跨域

    第一,首先要浏览器支持. Firefox和Chrome都支持了. IE10 也支持. IE8,9 需要使用其他方式才能支持 第二, 加上HTTP header. IIS 7 的方式比较容易. 就在we ...

  9. APP性能测试工具

    各种自动化工具作用: 自动化:appium 针对接口做压测:jmeter 执行一段脚本,随机乱点:monkey 如果有用loadrunner12的话 也可以用mobilerecoder录制脚本(lr1 ...

  10. scala中java并发编程

    Runnable/Callable 线程(Thread) Executors/ExecutorService Future 线程安全问题 示例:搜索引擎 解决方案 Runnable/Callable ...