中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Lua中__index的用法詳解

 當我們訪問一個表的不存在的域,返回結(jié)果為nil,這是正確的,但并不一定正確。實際上,這種訪問觸發(fā)Lua解釋器去查找__index metamethod:如果不存在,返回結(jié)果為nil;如果存在則由__index metamethod返回結(jié)果。

這個例子的原型是一種繼承。假設我們想創(chuàng)建一些表來描述窗口。每一個表必須描述窗口的一些參數(shù),比如:位置,大小,顏色風格等等。所有的這些參數(shù)都有默認的值,當我們想要創(chuàng)建窗口的時候只需要給出非默認值的參數(shù)即可創(chuàng)建我們需要的窗口。第一種方法是,實現(xiàn)一個表的構造器,對這個表內(nèi)的每一個缺少域都填上默認值。第二種方法是,創(chuàng)建一個新的窗口去繼承一個原型窗口的缺少域。首先,我們實現(xiàn)一個原型和一個構造函數(shù),他們共享一個metatable:

-- create a namespace

Window = {}

-- create the prototype with default values

Window.prototype = {x=0, y=0, width=100, height=100, }

-- create a metatable

Window.mt = {}

-- declare the constructor function

function Window.new (o)

    setmetatable(o, Window.mt)

    return o

end

現(xiàn)在我們定義__index metamethod:

Window.mt.__index = function (table, key)

    return Window.prototype[key]

end

這樣一來,我們創(chuàng)建一個新的窗口,然后訪問他缺少的域結(jié)果如下:

w = Window.new{x=10, y=20}

print(w.width)       --> 100

Lua發(fā)現(xiàn)w不存在域width時,但是有一個metatable帶有__index域,Lua使用w(the table)和width(缺少的值)來調(diào)用__index metamethod,metamethod則通過訪問原型表(prototype)獲取缺少的域的結(jié)果。

__index metamethod在繼承中的使用非常常見,所以Lua提供了一個更簡潔的使用方式。__index metamethod不需要非是一個函數(shù),他也可以是一個表。但它是一個函數(shù)的時候,Lua將table和缺少的域作為參數(shù)調(diào)用這個函數(shù);當他是一個表的時候,Lua將在這個表中看是否有缺少的域。所以,上面的那個例子可以使用第二種方式簡單的改寫為:

Window.mt.__index = Window.prototype

現(xiàn)在,當Lua查找metatable的__index域時,他發(fā)現(xiàn)window.prototype的值,它是一個表,所以Lua將訪問這個表來獲取缺少的值,也就是說它相當于執(zhí)行:

Window.prototype["藏寶閣-www.gamecbg.com"]

將一個表作為__index metamethod使用,提供了一種廉價而簡單的實現(xiàn)單繼承的方法。一個函數(shù)的代價雖然稍微高點,但提供了更多的靈活性:我們可以實現(xiàn)多繼承,隱藏,和其他一些變異的機制。

本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Step By Step(Lua元表與元方法)(轉(zhuǎn))
Lua概念備忘
Lua中實現(xiàn)類的原理
Lua筆記
Lua語言基礎匯總(8)
Lua學習之function
更多類似文章 >>
生活服務
熱點新聞
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服