很多语言专门提供了某种机制组织全局变量的命名,比如 Modula 的 modules,Java和 Perl 的 packages,C++的 namespaces。每一种机制对在 package 中声明的元素的可见性以及其他一些细节的使用都有不同的规则。但是他们都提供了一种避免不同库中命名冲突的问题的机制。每一个程序库创建自己的命名空间,在这个命名空间中定义的名字和其他命名空间中定义的名字互不干涉。Lua 并没有提供明确的机制来实现 packages。然而,我们通过语言提供的基本的机制很容易实现他。主要的思想是:像标准库一样,使用表来描述 package。
Account.lua
SpecialAccount.lua
lua_main.lua --脚本测试
采用此结构完成的脚本代码重用率高,管理方便。
Account.lua
module("Account", package.seeall) --文件名即包名称
function Account() --对象类就是方法的返回值(当然一个包可以定义两个对象了)
local objAccout = { balance = 0} --局部变量储存对象
function objAccout:deposit(v) --定义方法
self.balance = self.balance + v
end
function objAccout:new(o) --原型继承方法
o = o or {}
setmetatable(o, self)
self.__index = self
return o
end
function objAccout:withdraw (v) --定义方法
if v > self.balance then error"insufficient funds" end
self.balance = self.balance - v
end
return objAccout --返回对象
end
SpecialAccount.lua
module("SpecialAccount", package.seeall) --文件名即包名称
function SpecialAccount() --对象类就是方法的返回值(当然一个包可以定义两个对象了)
packMap = require "Account" --获取包
local Account = packMap.Account() --获取Account对象
local objSpecialAccount = Account:new() --继承Account对象
function objSpecialAccount:withdraw (v) --覆写方法
if v - self.balance >= self:getLimit() then
error"insufficient funds"
end
self.balance = self.balance - v
end
function objSpecialAccount:getLimit () --新增方法
return self.limit or 0
end
return objSpecialAccount
end
lua_main.lua --脚本测试
packMap = require "SpecialAccount"
SpecialAccount = packMap.SpecialAccount()
s = SpecialAccount:new{limit=1000.00}
s:deposit(100.00)
s:withdraw(200.00)
print(s.balance)
采用此结构完成的脚本代码重用率高,管理方便。