本文解释面向对象的一个例子,例子来源于http://www.lua.org/pil/16.2.html
文件UIBase.lua
module("UIBase", package.seeall)
Account = {balance = 0}
function Account:new (o)
--self = Account
o = o or {}
setmetatable(o, self)
self.__index = self
return o
end
function Account:deposit (v)
self.balance = self.balance + v
end
function Account:withdraw (v)
if v > self.balance then error"insufficient funds" end
self.balance = self.balance - v
end文件luastudy.lua
package.path = package.path .. ';E:\\testProject\\lua\\?.lua'
function printTable(t)
local strk = "";
local strv = "";
for i,v in pairs(t) do
strk = strk .. tostring(i) .. ' '
strv = strv .. tostring(v) .. ' '
end
print('------------begin------------')
print('table ' .. tostring(t))
print('key ' .. strk)
print('value ' .. strv)
print('-------------end-----------')
end
require 'UIBase'
local Account = UIBase.Account
printTable(Account)
SpecialAccount = Account:new()
printTable(Account)
printTable(SpecialAccount)
--s = Account.new(SpecialAccount)
--s.limit = 1000
s = SpecialAccount:new({limit=1000.00})
printTable(SpecialAccount)
print(s.limit)
s.deposit(s,100.00)
print(s.balance)输出为:
那么问题来了
问题1:输出的第一个表跟第二个表不一样,为什么?
不一样是因为这句 SpecialAccount = Account:new(),实质是执行了代码:
SpecialAccount = Account.new(Account)
在函数里面,self指的是Account,在函数里面有Account.__index=self.这句话导致了Account有了变化
问题2:输出的第一个表跟第二个表地址不变,为什么输出的第三个表跟第四个表地址变了?
第三个表是Account的new函数生成的,参数为空,返回的是新建的表。
第四个表示SpecialAccount的new函数生成的,参数为表{limit=1000.00},返回的是传入的参数表。
问题3:为什么s.deposit(s,100.00)能正确执行?
s是一个表,s的元表是SpecialAccount,这个通过s = SpecialAccount:new({limit=1000.00})可以看出来。
SpecialAccount的元表是Account,这个通过 SpecialAccount = Account:new()可以看出来
s没有deposit,就在s的元表SpecialAccount里面找,没找到就在SpecialAccount的元表Account里面找,找到了,就执行Account的deposit

7036

被折叠的 条评论
为什么被折叠?



