当前位置:编程学习 > JAVA >>

Lua--模块与包,最佳实践

 

最近在学Lua 一直对模块与包的使用有很多不明白的地方,有的引用使用. 有的引用使用: 到底都是怎么个情况呢?今天下午要搞定!
一个包就是模块的集合:A Package is a collection of modules.
 从Lua 5.1开始,可以使用require和module函数来分别引用和创建Lua中的模块,
调用模块内函数的简单方法:
[java] view plaincopy
require "mod"  
mod.foo()  
如果模块名太长,可以设置一个local变量
[java] 
local m = require "mod"  
m.foo()  
还可以重命名模块内的函数:
[java]  
require "mod"  
local f = mod.foo  
f()  
 
 
由于模块的概念基于一个Table,创建模块时要设置好模块名,声明模块M等操作,如下:
 
 1 --将模块名设置为require的参数,这样今后重命名模块时,只需重命名文件名即可。
 2 local modname = ...
 3 local M = {}
 4 _G[modname] = M
 5 
 6 M.i = {r = 0, i = 1}  --定义一个模块内的常量。
 7 function M.new(r,i) return {r = r, i = i} end
 8 function M.add(c1,c2) 
 9     return M.new(c1.r + c2.r,c1.i + c2.i)
10 end
11 
12 function M.sub(c1,c2)
13     return M.new(c1.r - c2.r,c1.i - c2.i)
14 end
15 --返回和模块对应的table。
16 return M
 
   但上面的这种太复杂和重复,所以要在5.1后,引入了一个module函数用来封装以上基本功能,在文件开头加入module(..., package.seeall) 就可以达到将当前的lua文件声明为一个module,不需要声明当前的module名字。
 
子module,使用. 来区分名字的level,如一个模块名为mod.sub就是一个mod的子模块,一个包package是所有模块的完全树。
 
 
至于什么时候用. 还是: 的问题,
 
[java] 
function Account.withdraw (self, v)  
      self.balance = self.balance - v  
end  
调用上面这个方法时:
 
[java] 
a1 = Account; Account = nil  
...  
a1.withdraw(a1, 100.00) -- OK  
 
或不带self的方式:
[java]  
function Account:withdraw (v)  
    self.balance = self.balance - v  
end  
调用时使用:
a:withdraw(100.00)
关于LuaModule使用的最佳实践:在module创建时定义好被引用的名字
[java]  
// in the main.lua file  
require "logging.test"  
require "test22"  
  
local function main()  
    print("OOLL")  
    basi.beforePrint()  
    see.beforePrint()  
end  
  
//logging.test.lua, logging是一个文件夹  
module('basi', package.seeall)  
  
function beforePrint()  
    print("IOK")  
end  
  
//test2.lua 这个文件和main.lua是位于同一个文件夹下面  
module('see', package.seeall)  
  
function beforePrint()  
    print("insss")  
end  
输出结果:
OOLL
IOK
insss
 

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,