Lua 元表(Metatable)

在 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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末热鞍,一起剝皮案震驚了整個濱河市葫慎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌薇宠,老刑警劉巖偷办,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異澄港,居然都是意外死亡椒涯,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門回梧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來废岂,“玉大人,你說我怎么就攤上這事狱意『” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵髓涯,是天一觀的道長袒啼。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么蚓再? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任滑肉,我火速辦了婚禮,結(jié)果婚禮上摘仅,老公的妹妹穿的比我還像新娘靶庙。我一直安慰自己,他們只是感情好娃属,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布六荒。 她就那樣靜靜地躺著,像睡著了一般矾端。 火紅的嫁衣襯著肌膚如雪掏击。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天秩铆,我揣著相機(jī)與錄音砚亭,去河邊找鬼。 笑死殴玛,一個胖子當(dāng)著我的面吹牛捅膘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播滚粟,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼寻仗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了凡壤?” 一聲冷哼從身側(cè)響起署尤,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎亚侠,沒想到半個月后沐寺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盖奈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了狐援。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钢坦。...
    茶點(diǎn)故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖啥酱,靈堂內(nèi)的尸體忽然破棺而出爹凹,到底是詐尸還是另有隱情,我是刑警寧澤镶殷,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布禾酱,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏颤陶。R本人自食惡果不足惜颗管,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望滓走。 院中可真熱鬧垦江,春花似錦、人聲如沸搅方。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽姨涡。三九已至衩藤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間涛漂,已是汗流浹背赏表。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留怖喻,地道東北人底哗。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像锚沸,于是被迫代替她去往敵國和親跋选。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 第一篇 語言 第0章 序言 Lua僅讓你用少量的代碼解決關(guān)鍵問題哗蜈。 Lua所提供的機(jī)制是C不擅長的:高級語言前标,動態(tài)...
    testfor閱讀 2,681評論 1 7
  • Nginx API for Lua Introduction ngx.arg ngx.var.VARIABLE C...
    吃瓜的東閱讀 5,806評論 0 5
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,444評論 0 17
  • 由于轉(zhuǎn)系到軟件學(xué)院距潘,我的大學(xué)有了涇渭分明的兩個階段 – 前半個階段是對所學(xué)專業(yè)極為失望故而拼命學(xué)英語想抓住一根救命...
    無用之趣閱讀 559評論 0 2
  • 在我看來音比,孤獨(dú)是是個中性詞俭尖,它不好也不壞,時而好時而壞洞翩。你可以說孤獨(dú)不合群稽犁,也可以說它曲高和寡;你可以認(rèn)為它清高,...
    林清萓閱讀 101評論 0 7