Lua中module的用法

1.云风的总结 http://blog.codingnow.com/2006/02/lua_51_module.html

lua 从 5.1 开始终于官方提供统一的 module 实现标准了,这是个值得庆幸的事。今天读了下相关的源码和文档,把这套机制搞清楚了,还是很巧妙的。从简洁这个角度看,要比 python 强 :)

有一点容易被忽略掉(我的同事在用的时候就忽略掉了),module 指令运行完后,整个环境被压栈,所以前面全局的东西再看不见了。比如定义了一个 test 模块,使用

module("test")

后,下面不再看的见前面的全局环境。如果在这个模块里想调用 print 输出调试信息怎么办呢?一个简单的方法是

local print=print
module("test")

这样 print 是一个 local 变量,下面也是可见的。或者可以用

local _G=_G
module("test")

那么 _G.print 也是可以用的。

当然还有一种巧妙的方式,lua 5.1 提供了一个 package.seeall 可以作为 module 的option 传入

module("test",package.seeall)

这样就 OK 了。至于它们是如何工作的,还是自己读源码会理解的清楚一些。

在读源码时可以发现很多 lua 的技巧,还有一些 undocumented 的东西,比如 newproxy :) 它是一个 unsupported 且 undocumented 的东西,但是它希望实现的却是个巧妙的玩意。


2.module方法的使用

[plain]  view plain  copy
  1. module (“moduleA”)   

相当于执行了以下

[plain]  view plain  copy
  1. local name = “moduleA”        
  2. local M = {}                               
  3. _G[name] = M                        
  4. package.loaded[modname] = M      
  5. setfenv(1,M)                                

3.关于module( ... , package.seeall)

        一般在一个Lua文件内以module函数开始定义一个包。module同时定义了一
个新的包的函数环境,以使在此包中定义的全局变量都在这个环境中,而非
使用包的函数的环境中。理解这一点非常关键。 “module(..., package.seeall)”
的意思是定义一个包,包的名字与定义包的文件的名字相同,并且在包的函数
环境里可以访问使用包的函数环境。
使用方式
        一般用require函数来导入一个包,要导入的包必须被置于包路径(package
path)上。包路径可以通过package.path或者环境变量来设定。一般来说,
当前工作路径总是在包路径中。

       例如 文件 a.lua

[plain]  view plain  copy
  1. module (..., package.seeall)  
  2. t = {}  
  3. function f()  
  4.  --todo  
  5. end  
         文件 main.lua

[plain]  view plain  copy
  1. require "a"  
调用脚本a中的任何全局变量或者函数必须加上a.
实现在不同的lua文件中可以用相同的名称定义变量或者函数

猜你喜欢

转载自blog.csdn.net/ykr168age/article/details/77164187