Lua module机制分析
来源:互联网 发布:优化工具 编辑:程序博客网 时间:2024/05/16 00:41
Lua module机制分析
版权声明:本文为博主原创文章,未经博主允许不得转载。
Lua中的模块(module)机制有点类似于C语言的动态库,可以将一些公共的代码放在模块中,以API的形式提供给Lua应用脚本使用。使用模块或许还可以做成像Android的Application Frameworks,建立一种新的应用程序编程模型,只是猜想。
模块最简单的使用方式:
- require “os”
- 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中查找模块是否存在,有的话就返回该值。可以使用如下函数输出表中的内容
- function walkTable(t)
- for k,v in pairs(t) do
- print("+++",k,v,"+++")
- end
- 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函数的时候,如下所示;
- module “mymodule”
实际上等同于以下的语句:
- local modname = “mymodule” – 定义模块名
- local M = {} -- 定义用于返回的模块表
- _G[modname] = M -- 将模块表加入到全局变量中
- package.loaded[modname] = M -- 将模块表加入到package.loaded中,防止多次加载
- 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/
- Lua module机制分析
- Lua module机制分析
- Lua module机制分析
- Lua module机制分析
- lua内存机制分析
- lua内存机制分析
- Lua Module
- lua module
- Lua Module
- Lua C module 注意事项
- lua 5.1 的 module
- Lua Bit Operations Module
- openresty+lua+module
- openresty+lua+module(2)
- openresty+lua+module(3)
- lua 重新加载module
- lua 5.1 的 module
- lua require与module
- 使用java实现邮件发送功能(已封装)
- 【C++】C++基础:指针__引用__const
- 将JavaBean用DOM4J转换成xml文件,用DOM4J解析xml文件
- HttpUrlConnection底层实现
- Android搭建自己的lib库
- Lua module机制分析
- UVA
- linux OOM-killer机制(杀掉进程,释放内存)
- PAT(乙级)1017
- Python 学习
- 为什么大多数人的网站建设都是失败的?
- leetcode 461:Hamming Distance
- WebView启动安全浏览
- oracle 将Number型字段转为时间类型 将毫秒转为时间类型