元表(metatable)是 Lua 里每種類型的值的默認(rèn)操作方式的集合,例如,數(shù)字可以加減乘除、字符串可以連接合并、table 可以插入一對(duì) key-value 值、函數(shù)可以被調(diào)用等等,這些操作都遵循其預(yù)定義的行為來執(zhí)行。
而值的默認(rèn)操作方式不是一成不變的,可以通過元表來修改其行為表現(xiàn),或者是新定義一些默認(rèn)沒有的操作。例如,當(dāng)兩個(gè) table 相加時(shí), Lua 會(huì)檢查它們之間的元表里是否有 "__add" 這個(gè)函數(shù),如果定義有這個(gè)函數(shù), 則調(diào)用這個(gè)函數(shù)來執(zhí)行一次加法操作。
這里,相加這個(gè)操作的函數(shù)名 -- "__add" 是元表的鍵名(元表的鍵名也稱之為事件(event),一般以 2 個(gè)下劃線 "_" 開頭),而 "__add" 函數(shù)則是這個(gè)相加操作的元方法(metamethod)。對(duì)于值的操作,Lua 都將其關(guān)聯(lián)上一個(gè)被稱作事件的指定健,當(dāng) Lua 需要對(duì)一個(gè)值發(fā)起這些操作中的一個(gè)時(shí), 它會(huì)去檢查值的元表里是否有對(duì)應(yīng)事件。如果有,則鍵名對(duì)應(yīng)的值(元方法)將控制 Lua 怎樣去執(zhí)行這個(gè)操作。
getmetatable - 獲取元表
Lua 里每個(gè)值都有一個(gè)元表。table 類型和 userdata 類型的值可以有各自獨(dú)立的元表,而其他類型的值則是公用其類型所預(yù)先定義的元表。例如,可以用 getmetatable 來獲取一個(gè)字符串的元表:
上面的操作會(huì)輸出 "table: 0x7fa8614080f0" 的 table,里面包含著預(yù)先定義給字符串的操作方法,其內(nèi)容結(jié)構(gòu)如下:
Lua 在創(chuàng)建新的 table 時(shí)不會(huì)創(chuàng)建元表,因此想調(diào)用 getmetatable 函數(shù)獲取其元表的話,只會(huì)返回一個(gè) nil 值。
setmetatable - 修改元表
對(duì)于上面所說的新創(chuàng)建的 table 是空元表的問題,可以用 setmetatable 來修改其元表:
對(duì)于上面所說的 2 個(gè) table 相加的情況,可以給 table 添加一個(gè) __add 的元方法就可以進(jìn)行相加操作:
標(biāo)簽:天門 臺(tái)灣 天門 德宏 宣城 金昌 儋州 濰坊
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Lua中的元表和元方法學(xué)習(xí)筆記》,本文關(guān)鍵詞 Lua,中的,元表,和,元,方法,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。