當(dāng)我們訪問一個表的不存在的域,返回結(jié)果為nil,這是正確的,但并不一定正確。實際上,這種訪問觸發(fā)lua解釋器去查找__index metamethod:如果不存在,返回結(jié)果為nil;如果存在則由__index metamethod返回結(jié)果。
這個例子的原型是一種繼承。假設(shè)我們想創(chuàng)建一些表來描述窗口。每一個表必須描述窗口的一些參數(shù),比如:位置,大小,顏色風(fēng)格等等。所有的這些參數(shù)都有默認(rèn)的值,當(dāng)我們想要創(chuàng)建窗口的時候只需要給出非默認(rèn)值的參數(shù)即可創(chuàng)建我們需要的窗口。第一種方法是,實現(xiàn)一個表的構(gòu)造器,對這個表內(nèi)的每一個缺少域都填上默認(rèn)值。第二種方法是,創(chuàng)建一個新的窗口去繼承一個原型窗口的缺少域。首先,我們實現(xiàn)一個原型和一個構(gòu)造函數(shù),他們共享一個metatable:
__index metamethod在繼承中的使用非常常見,所以Lua提供了一個更簡潔的使用方式。__index metamethod不需要非是一個函數(shù),他也可以是一個表。但它是一個函數(shù)的時候,Lua將table和缺少的域作為參數(shù)調(diào)用這個函數(shù);當(dāng)他是一個表的時候,Lua將在這個表中看是否有缺少的域。所以,上面的那個例子可以使用第二種方式簡單的改寫為:
標(biāo)簽:天門 儋州 臺灣 天門 濰坊 金昌 德宏 宣城
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Lua中的__index方法詳解》,本文關(guān)鍵詞 Lua,中的,index,方法,詳解,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。