Lua module机制分析

From: http://blog.csdn.net/chenyufei1013/article/details/4438801

Lua中的模块(module)机制有点类似于C语言的动态库,可以将一些公共的代码放在模块中,以API的形式提供给Lua应用脚本使用。使用模块或许还可以做成像Android的Application Frameworks,建立一种新的应用程序编程模型,只是猜想。

模块最简单的使用方式:

[javascript] view plain copy print ?
  1. require “os”
  2. os.clock()
  • table

Lua语言共有8中数据类型,其中table(表)类型实现了“关联数组(associative array)”。table中可以保存各种数据类型。和table关联的metatable,它定义了表的操作的一些行为,比如: 使用+操作时,会去查找metatable的属性__add,有的话执行。

  • function

function是Lua中8中基本类型之一,和其它类型一样可以作为值传递。和function有关联的表是环境表(environment),可以认为是function的执行环境。可以通过setfenv()和getfenv()来设置和获取函数的环境表。函数中对于全局的操作,比如:定义全局变量等;就是在这个表中进行的。多个函数可以共享一个表

  • require

当使用require加载一个模块时,实际上做了如下的事情:

在表package.loaded中查找模块是否存在,有的话就返回该值。可以使用如下函数输出表中的内容

[c-sharp] view plain copy print ?
  1. function walkTable(t)
  2. for k,v in pairs(t) do
  3. print("+++",k,v,"+++")
  4. end
  5. end

package.loaded中的内容如下,其中包含了一些默认加载的库和全局表_G

[c-sharp] view plain copy print ?
  1. +++ string , table: 003B82B0 +++
  2. +++ debug , table: 003B9300 +++
  3. +++ package , table: 003B5C30 +++
  4. +++ _G , table: 003B2E10 +++
  5. +++ io , table: 003B7320 +++
  6. +++ os , table: 003B7988 +++
  7. +++ table , table: 003B51E0 +++
  8. +++ math , table: 003B8728 +++
  9. +++ coroutine , table: 003B59D8 +++

为模块查找加载器(loader),查询package.preload,通常为空

加载Lua文件使用loadfile函数。loadfile会将文件当作函数来加载,require会将模块名作为参数传给该函数。若有返回值则将返回值放入表package.loaded中。若没有则返回表package.loaded中的值。

  • module

当在模块文件中使用module函数的时候,如下所示;

[c-sharp] view plain copy print ?
  1. module “mymodule”

实际上等同于以下的语句:

[c-sharp] view plain copy print ?
  1. local modname = “mymodule” – 定义模块名
  2. local M = {} -- 定义用于返回的模块表
  3. _G[modname] = M -- 将模块表加入到全局变量中
  4. package.loaded[modname] = M -- 将模块表加入到package.loaded中,防止多次加载
  5. setfenv(1,M) -- 将模块表设置为函数的环境表,这使得模块中的所有操作是以在模块表中的,这样定义函数就直接定义在模块表中

通过module(),可以方便的编写模块中的内容。

测试环境

lua for windows IDE

参考资料

Lua 5.1 Reference Manual

http://www.lua.org/manual/5.1/

Programming in Lua (first edition)

http://www.lua.org/pil/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值