Lua module机制分析

转载自http://www.cnblogs.com/orez88/articles/2139160.html
Lua
中的模块(module)机制有点类似于C语言的动态库,可以将一些公共的代码放在模块中,以API的形式提供给Lua应用脚本使用。
使用模块或许还可以做成像
AndroidApplication Frameworks,建立一种新的应用程序编程模型,只是猜想。

模块最简单的使用方式:

  1. require “os”  
  2. os.clock()  
  • table

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

  • function

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

  • require

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

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

  1. function walkTable(t)  
  2.        for k,v in pairs(t) do  
  3.               print("+++",k,v,"+++")  
  4.        end  
  5. end  

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

+++ string      ,      table: 003B82B0     +++  
+++ debug      ,      table: 003B9300      +++  
+++ package   ,      table: 003B5C30     +++  
+++ _G   ,      table: 003B2E10     +++  
+++ io     ,      table: 003B7320      +++  
+++ os    ,      table: 003B7988      +++  
+++ table ,      table: 003B51E0     +++  
+++ math       ,      table: 003B8728      +++  
+++ coroutine ,      table: 003B59D8     +++  


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

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

  • module

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

  1. module “mymodule”  

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

local modname = “mymodule”     – 定义模块名  
local M = {}                               -- 定义用于返回的模块表  
_G[modname] = M                      -- 将模块表加入到全局变量中  
package.loaded[modname] = M    -- 将模块表加入到package.loaded中,防止多次加载  
setfenv(1,M)                               -- 将模块表设置为函数的环境表,这使得模块中的所有操作是以在模块表中的,这样定义函数就直接定义在模块表中 
 通过module(),可以方便的编写模块中的内容。

posted on 2013-12-21 17:25 cslover 阅读(553) 评论(0)  编辑 收藏 引用 所属分类: Lua


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2013年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

导航

统计

常用链接

留言簿(1)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜