元表
在 Lua table 中我們可以訪問對應(yīng)的key來得到value值胶坠,但是卻無法對兩個 table 進(jìn)行聯(lián)動操作。
通過設(shè)置table的元表繁堡,可以擴(kuò)展table的功能沈善,對表的操作都是通過元方法來實現(xiàn)的比如:__index,__add
元表的使用:
mytable = {}
mymetatable = {}
setmetatable(mytable,mymetatable)
以上代碼也可以直接寫成一行:mytable = setmetatable({},{})
getmetatable(mytable) --返回mytable的元表
__index方法:
當(dāng)你通過鍵來訪問 table 的時候,如果這個鍵沒有值椭蹄,那么Lua就會尋找該table的metatable(假定有metatable)中的__index 鍵闻牡。如果__index為table類型,Lua會在table中查找相應(yīng)的鍵绳矩;如果__index為function類型罩润,則該方法返回值作為對應(yīng)key的值。
例子:other = { foo = 3 }
t = setmetatable({}, { __index = other })
t.foo //輸出3
例子:other = { foo = 3}
function other:new()
? ? self.__index=self
end
other:new()
t = setmetatable({}, other)
print(t.foo) //輸出3
例子2:
mytable = {}
newtable = {}
newtable.key1 = "haha"
newtable.__index = {key2="hehe"}
setmetatable(mytable,newtable)
print(mytable.key2) ?輸出:hehe
如果__index包含一個函數(shù)的話翼馆,如果在表中找不到相應(yīng)的key割以,Lua就會調(diào)用那個函數(shù),table和鍵會作為參數(shù)傳遞給函數(shù)写妥;該函數(shù)的返回值作為key的value
mytable = setmetatable({key1 = "value1"}, {
? ? __index = function(mytable, key)
? ? ? ? ? ? ? ? ? ? ????print(key)
? ? ? ? ? ? ? ? ? ? return "hehe"
? ? ? ? ? ? ? ? end
? })?
? print(mytable.key2)?//輸出key2 ?hehe
?__newindex方法:
當(dāng)你給表的一個缺少的索引賦值拳球,解釋器就會查找__newindex 元方法:如果存在則調(diào)用這個函數(shù)而不進(jìn)行賦值操作审姓。
mymetatable = {}
mytable = setmetatable({key1 = "value1"}, { __newindex = mymetatable })
mytable.newkey = "新值2"
print(mytable.newkey,mymetatable.newkey) 輸出:nil????新值2
__gc:?
table銷毀時會調(diào)用
__gc = function()
? ? ? ? ? ? print("gcle")
? ? end
? })
面對對象:
對象由屬性和方法組成珍特。LUA中最基本的結(jié)構(gòu)是table,所以需要用table來描述對象的屬性魔吐。
lua中的function可以用來表示方法扎筒。那么LUA中的類可以通過table + function模擬出來莱找。
至于繼承,可以通過metetable模擬出來(不推薦用嗜桌,只模擬最基本的對象大部分時間夠用了)奥溺。
Account = {balance = 0}
function Account.withdraw (v)
? ? Account.balance = Account.balance - v
end
function Account:test()
? ? print(self.balance)
end
Account.withdraw(100.00)
Account:test() //輸出-100.0
繼承方式:
local class = {}
function class:new()
????self.__index = self
????return setmetatable( {}, self )
end
function class:say()
????print(111)
end
local o1 = class:new()
o1.say()
local o2 = o1:new()
o2.say()