国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > 綜合 > 正文

Lua中的__index方法詳解

2024-07-21 23:04:33
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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

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

復(fù)制代碼 代碼如下:

-- 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:
復(fù)制代碼 代碼如下:

Window.mt.__index = function (table, key)
    return Window.prototype[key]
end

這樣一來(lái),我們創(chuàng)建一個(gè)新的窗口,然后訪問(wèn)他缺少的域結(jié)果如下:
復(fù)制代碼 代碼如下:

w = Window.new{x=10, y=20}
print(w.width)       --> 100

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

 

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

復(fù)制代碼 代碼如下:

Window.mt.__index = Window.prototype

現(xiàn)在,當(dāng)Lua查找metatable的__index域時(shí),他發(fā)現(xiàn)window.prototype的值,它是一個(gè)表,所以Lua將訪問(wèn)這個(gè)表來(lái)獲取缺少的值,也就是說(shuō)它相當(dāng)于執(zhí)行:
復(fù)制代碼 代碼如下:

Window.prototype["width"]

將一個(gè)表作為_(kāi)_index metamethod使用,提供了一種廉價(jià)而簡(jiǎn)單的實(shí)現(xiàn)單繼承的方法。一個(gè)函數(shù)的代價(jià)雖然稍微高點(diǎn),但提供了更多的靈活性:我們可以實(shí)現(xiàn)多繼承,隱藏,和其他一些變異的機(jī)制。我們將在第16章詳細(xì)的討論繼承的方式。
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宁远县| 依兰县| 岳西县| 怀远县| 远安县| 武冈市| 石楼县| 育儿| 南城县| 河间市| 邹平县| 左云县| 龙游县| 琼海市| 鸡西市| 大冶市| 香港 | 萨嘎县| 佛坪县| 句容市| 神木县| 台北市| 乾安县| 罗山县| 福清市| 嵊州市| 安达市| 铁力市| 嘉黎县| 股票| 丹巴县| 宝兴县| 稻城县| 珲春市| 贵阳市| 鲜城| 沅陵县| 会昌县| 祥云县| 隆回县| 清丰县|