Lua程式設計(四十二)

2021-09-30 20:03:51 字數 1164 閱讀 4172

lua語言還提供了一種改變表在兩種正常情況下的行為的方式,即訪問和修改表中不能存在的字段。

__index 元方法

當訪問乙個表中不存在的字段時會得到nil。實際上,這些訪問會引發直譯器查詢乙個名為__index的元方法。如果沒有這個元方法,那麼像一般情況下一樣,結果就是nil;否則,則由這個元方法來提供最終結果。

下面介紹乙個關於繼承的原型示例。

prototye =
然後,宣告乙個建構函式,讓建構函式建立共享同乙個元表的新視窗:

local  mt = {}

function new (o)

setmetatable(o, mt)

return o

endmt.__index = function (_, key)

return prototype[key]

endw = new

print(w.width) --> 100

lua語言會發現w中沒有對應的字段「width」, 但卻有乙個帶有__index元方法的元表。因此,lua語言會以w(表)和"width" 為引數來呼叫這個元方法,元方法隨後會用這個鍵來檢索原型並返回結果。

lua語言中,使用元方法__index來實現繼承是很普遍的方法。元方法 __index不應定必須是乙個函式,它還可以是乙個表。當元方法是乙個函式時,lua語言會以表和不存在的鍵為引數呼叫該函式。當元方法是乙個表時,lua語言就訪問這個表。

將乙個表用作__index元方法為實現單繼承提供了一種簡單快捷的方法。雖然將函式用作元方法開銷更昂貴,但函式卻更加靈活;我們可以通過函式來實現多繼承,快取即其他一些辯題。

如果我們希望在訪問乙個表時不呼叫__index元方法,那麼可以使用函式rawget。呼叫rawget(t,i)會對錶t進行原始訪問,即在不考慮元表的情況下對錶進行簡單的訪問。

隨筆(四十二)

recyclerview 效能優化 安卓 offer 收割基 2.recyclerview 資料預取 3.androidofferkiller 4.android效能優化第 七 篇 strickmode嚴苛模式檢測耗時與記憶體問題 5.accessibilityservice 幫你實現 androi...

四十二 移植bootm命令

2 加上了原版u boot裡dm9000傳送函式裡傳送前後都要清除傳送標誌 3 取消了老師說的要對包進行判斷,實際上不判斷效果還要好一點,那一部分,要求只要在空讀前後有20微妙的時間間隔就好了,經我實際測試,我的開發板確實只用空讀一次就滿足該條件。4 取消了中斷處理函式裡之前為了驗證進的是什麼中斷的...

effective C 條款四十二解讀

了解typename的雙重意義 1.template 與template 沒有區別。typename 的另一種用法,我們以乙個 來解釋 templatevoid print2nd const c container if container.size 2 c const iterator iter ...