因?yàn)椴幌朐谝黄恼吕飻D太多知識點(diǎn),所以,有些小知識點(diǎn)就集合到這樣的文章里吧~
1.沉默技能——拒絕__index和__newindex效果
雖然__index和__newindex是很好用的功能,但是,有時(shí)候我們又希望很純粹地去調(diào)用table或者給table賦值。
那,這時(shí)候怎么辦?給table重新設(shè)置一個(gè)元表?不,這個(gè)做法很糟糕~
于是,體貼的Lua又給我們提供了這樣的調(diào)用方式,如下代碼:
通過rawget函數(shù)可以忽略元表的__index功效,純粹地從t1中調(diào)用字段。
rawget的第一個(gè)參數(shù)是要調(diào)用的table,第二個(gè)參數(shù)是table的字段名。
因此,通過rawget調(diào)用t1的name字段,只能返回nil,而調(diào)用hehe字段,則能正確取得值。
同樣的是,rawset函數(shù)可以忽略元表的__newindex功效,純粹地給t1賦值。
來看看輸出結(jié)果:
這就相當(dāng)于t1并不存在__index和__newindex元方法了。
怎么樣,這個(gè)沉默技能很有意思吧。
2.只讀的table
吶,假設(shè)你又繼續(xù)是一個(gè)主程,你寫了一個(gè)很牛的功能,然后作為主程的你,每晚都要回家看電影。
所以你的功能不得不交給公司里那些剛畢業(yè)不到30年的新人去維護(hù),讓他們天天加班到晚上6點(diǎn)半。(小若:喂!6點(diǎn)半算加班嗎?)
然而,這么牛的功能,可不能被這些新人隨便改壞了,所以,除了保護(hù)table的元表之外,你還希望保護(hù)table的字段。
你要確保這些新人不會(huì)去修改你table的字段值。
沒錯(cuò),這時(shí)候就可以使用__index和__newindex來實(shí)現(xiàn)了,如下代碼:
這可能有點(diǎn)難弄懂,先來看看輸出結(jié)果吧:
a.首先,readOnly會(huì)創(chuàng)建一個(gè)新的table,然后把我們傳進(jìn)去的table作為__index元方法。
b.元表里還增加了__newindex,用來阻止不存在字段的賦值操作。
c.readOnly返回的table已經(jīng)不是我們原來的table了,它是一個(gè)空的table,但是它被設(shè)置了一個(gè)新的元表。
d.開始對days執(zhí)行賦值操作:days[2] = “星期三哪去了???” 。
e.days是一個(gè)空的table,所以它不存在這個(gè)字段,也因此,會(huì)調(diào)用__newindex元方法,賦值失敗。
f.如果只是調(diào)用days,不進(jìn)行賦值,如:print(days[2]); 則能正常輸出字段值,因?yàn)閐ays的元表里有__index元方法。雖然days中不存在2這個(gè)字段,但是可以通過__index找到這個(gè)字段。
總而言之,最終,days成為了一個(gè)只可以讀取,不能進(jìn)行賦值操作的table。
(小若:那如果我使用rawset函數(shù)呢?不就打破了你的限制嗎?)
咳咳,我們繼續(xù)。
3.結(jié)束
終于結(jié)束,這幾天幾乎都在寫文章了,沒怎么看書,不過我會(huì)繼續(xù)堅(jiān)持寫文章的~
看完書不記錄一下,總覺得不夠深刻~而且寫完文章心情很好~
標(biāo)簽:張掖 武漢 延邊 新余 嘉峪關(guān) 黑龍江 江西 宜賓
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Lua中__index和__newindex之間的沉默與合作》,本文關(guān)鍵詞 Lua,中,index,和,newindex,之,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。