在 Lua table 中我們可以訪問對應(yīng)的key來得到value值陵究,但是卻無法對兩個 table 進(jìn)行操作轿亮。
因此 Lua 提供了元表(Metatable)煤蚌,允許我們改變table的行為岳瞭,每個行為關(guān)聯(lián)了對應(yīng)的元方法仁烹。
例如,使用元表我們可以定義Lua如何計算兩個table的相加操作a+b迄靠。
當(dāng)Lua試圖對兩個表進(jìn)行相加時秒咨,先檢查兩者之一是否有元表,之后檢查是否有一個叫"__add"的字段掌挚,若找到雨席,則調(diào)用對應(yīng)的值。"__add"等即時字段吠式,其對應(yīng)的值(往往是一個函數(shù)或是table)就是"元方法"陡厘。
有兩個很重要的函數(shù)來處理元表:
setmetatable(table,metatable):對指定table設(shè)置元表(metatable),如果元表(metatable)中存在__metatable鍵值特占,setmetatable會失敗 糙置。
getmetatable(table):返回對象的元表(metatable)。
以下實(shí)例演示了如何對指定的表設(shè)置元表:
以上代碼也可以直接寫成一行:
以下為返回對象元表:
__index 元方法
這是 metatable 最常用的鍵是目。
當(dāng)你通過鍵來訪問 table 的時候谤饭,如果這個鍵沒有值,那么Lua就會尋找該table的metatable(假定有metatable)中的__index 鍵懊纳。如果__index包含一個表格揉抵,Lua會在表格中查找相應(yīng)的鍵。
我們可以在使用 lua 命令進(jìn)入交互模式查看:
如果__index包含一個函數(shù)的話长踊,Lua就會調(diào)用那個函數(shù)功舀,table和鍵會作為參數(shù)傳遞給函數(shù)。
__index 元方法查看表中元素是否存在身弊,如果不存在,返回結(jié)果為 nil列敲;如果存在則由 __index 返回結(jié)果阱佛。
實(shí)例輸出結(jié)果為:
實(shí)例解析:
mytable 表賦值為{key1 = "value1"}。
mytable 設(shè)置了元表戴而,元方法為 __index凑术。
在mytable表中查找 key1,如果找到所意,返回該元素淮逊,找不到則繼續(xù)。
在mytable表中查找 key2扶踊,如果找到泄鹏,返回 metatablevalue,找不到則繼續(xù)秧耗。
判斷元表有沒有__index方法备籽,如果__index方法是一個函數(shù),則調(diào)用該函數(shù)分井。
元方法中查看是否傳入 "key2" 鍵的參數(shù)(mytable.key2已設(shè)置)车猬,如果傳入 "key2" 參數(shù)返回 "metatablevalue"霉猛,否則返回 mytable 對應(yīng)的鍵值。
我們可以將以上代碼簡單寫成:
總結(jié)
Lua查找一個表元素時的規(guī)則珠闰,其實(shí)就是如下3個步驟:
1.在表中查找惜浅,如果找到,返回該元素伏嗜,找不到則繼續(xù)
2.判斷該表是否有元表坛悉,如果沒有元表,返回nil阅仔,有元表則繼續(xù)吹散。
3.判斷元表有沒有__index方法,如果__index方法為nil八酒,則返回nil空民;如果__index方法是一個表,則重復(fù)1羞迷、2界轩、3;如果__index方法是一個函數(shù)衔瓮,則返回該函數(shù)的返回值浊猾。
內(nèi)容來自:runoob.com 菜鳥教程
整理:極動云,寧波家電物聯(lián)網(wǎng)云平臺
CONTACT US: http://www.iot-jd.com