关于Lua Module机制分析

移动开发 iOS
关于Lua Module机制分析是本文要介绍的内容,主要是来了解并学习Lua Module机制,具体内容来看本文详解。

关于Lua Module机制分析是本文要介绍的内容,主要是来了解并学习Lua Module机制,具体内容来看本文详解。Lua中的模块(module)机制有点类似于C语言的动态库,可以将一些公共的代码放在模块中,以API的形式提供给Lua应用脚本使用。使用模块或许还可以做成像Android的Application Frameworks,建立一种新的应用程序编程模型,只是猜想。

模块最简单的使用方式:

  1. view plaincopy to clipboardprint?require “os”    
  2. os.clock()    
  3. require “os”  
  4. 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中查找模块是否存在,有的话就返回该值。可以使用如下函数输出表中的内容

  1. view plaincopy to clipboardprint?function walkTable(t)    
  2.        for k,v in pairs(t) do    
  3.               print("+++",k,v,"+++")    
  4.        end    
  5. end    
  6. function walkTable(t)  
  7.        for k,v in pairs(t) do  
  8.               print("+++",k,v,"+++")  
  9.        end  
  10. end  

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

  1. view plaincopy to clipboardprint?+++ 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     +++    
  10. +++ string      ,      table: 003B82B0     +++  
  11. +++ debug      ,      table: 003B9300      +++  
  12. +++ package   ,      table: 003B5C30     +++  
  13. +++ _G   ,      table: 003B2E10     +++  
  14. +++ io     ,      table: 003B7320      +++  
  15. +++ os    ,      table: 003B7988      +++  
  16. +++ table ,      table: 003B51E0     +++  
  17. +++ math       ,      table: 003B8728      +++  
  18. +++ coroutine ,      table: 003B59D8     +++  

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

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

module  

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

  1. view plaincopy to clipboardprint?module “mymodule”    
  2. module “mymodule” 

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

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

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

测试环境

  1. lua for windows IDE 

小结:关于Lua Module机制分析的内容介绍完了,希望通过本文的学习能对你有所帮助!

责任编辑:zhaolei 来源: 互联网
相关推荐

2011-08-23 14:33:51

Lua捕获字符串

2011-08-25 15:41:42

Lua源码

2011-08-29 15:53:04

Lua位运算

2011-08-24 15:42:38

LUA源代码

2011-08-24 16:24:54

Lua源代码

2011-08-24 17:19:20

Lua源文件

2021-02-22 11:30:07

Golang 1.16ModuleGolang

2011-08-25 15:51:10

Lua脚本

2011-08-29 16:37:21

Lua协同线程

2011-08-23 15:34:56

Lua模式 匹配

2011-08-24 14:33:14

LUA开发环境Decoda

2011-09-06 17:37:01

LUA应用

2011-08-25 17:25:55

LUADelphi

2011-08-25 14:03:32

UbuntuLUA安装

2011-09-01 17:46:22

MySQL ProxyLua脚本

2011-08-24 14:14:13

LUA环境 配置

2009-11-09 17:55:13

WCF缓存

2011-08-25 15:21:02

Lua字符串

2013-12-12 16:44:25

Lua协程

2011-08-24 15:34:44

MinGWLua环境配置
点赞
收藏

51CTO技术栈公众号