最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Lua中的__index方法詳解

 更新時(shí)間:2015年04月22日 09:26:21   投稿:junjie  
這篇文章主要介紹了Lua中的__index方法詳解,本文詳細(xì)講解了__index方法的相關(guān)知識(shí),以及代碼示例,需要的朋友可以參考下

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

這個(gè)例子的原型是一種繼承。假設(shè)我們想創(chuàng)建一些表來描述窗口。每一個(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

這樣一來,我們創(chuàng)建一個(gè)新的窗口,然后訪問他缺少的域結(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(缺少的值)來調(diào)用__index metamethod,metamethod則通過訪問原型表(prototype)獲取缺少的域的結(jié)果。

__index metamethod在繼承中的使用非常常見,所以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)單的改寫為:

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

Window.mt.__index = Window.prototype

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

Window.prototype["width"]

將一個(gè)表作為__index metamethod使用,提供了一種廉價(jià)而簡(jiǎn)單的實(shí)現(xiàn)單繼承的方法。一個(gè)函數(shù)的代價(jià)雖然稍微高點(diǎn),但提供了更多的靈活性:我們可以實(shí)現(xiàn)多繼承,隱藏,和其他一些變異的機(jī)制。我們將在第16章詳細(xì)的討論繼承的方式。

相關(guān)文章

  • Lua中string.len()使用指南

    Lua中string.len()使用指南

    Lua 字符串庫(kù)中的所有函數(shù)都導(dǎo)出在模塊 string 中,今天我們先來看看string.len()的使用,有需要的小伙伴可以參考下
    2016-08-08
  • Lua中的閉包小結(jié)

    Lua中的閉包小結(jié)

    這篇文章主要介紹了Lua中的閉包小結(jié),本文對(duì)閉包的概念做了講解,同時(shí)給出閉包代碼示例,需要的朋友可以參考下
    2014-09-09
  • Lua中使用table實(shí)現(xiàn)的其它5種數(shù)據(jù)結(jié)構(gòu)

    Lua中使用table實(shí)現(xiàn)的其它5種數(shù)據(jù)結(jié)構(gòu)

    這篇文章主要介紹了Lua中使用table實(shí)現(xiàn)的其它5種數(shù)據(jù)結(jié)構(gòu),本文用table為基礎(chǔ),實(shí)現(xiàn)了數(shù)組、鏈表、隊(duì)列、集合等數(shù)據(jù)類型,需要的朋友可以參考下
    2014-09-09
  • Lua中字符串(string)淺析

    Lua中字符串(string)淺析

    這篇文章主要介紹了Lua中字符串(string)淺析,本文講解了字符串的聲明、連接、簡(jiǎn)單的使用方法等,是一篇入門教程,需要的朋友可以參考下
    2014-09-09
  • Lua中獲取table長(zhǎng)度問題探討

    Lua中獲取table長(zhǎng)度問題探討

    這篇文章主要介紹了Lua中獲取table長(zhǎng)度問題探討,本文非常深入的研究了Lua中table長(zhǎng)度的獲取問題,分析了各種各樣的情況,需要的朋友可以參考下
    2015-04-04
  • lua日志文件處理代碼

    lua日志文件處理代碼

    本文給大家分享的是使用lua編寫的日志文件的處理代碼,非常的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下。
    2015-09-09
  • Lua中的異常處理pcall、xpcall、debug使用實(shí)例

    Lua中的異常處理pcall、xpcall、debug使用實(shí)例

    這篇文章主要介紹了Lua中的異常處理pcall、xpcall、debug使用實(shí)例,這3個(gè)函數(shù)是Lua中的異常處理必須用到的,需要的朋友可以參考下
    2014-09-09
  • Lua中break語(yǔ)句的使用方法詳解

    Lua中break語(yǔ)句的使用方法詳解

    這篇文章主要介紹了Lua中break語(yǔ)句的使用方法詳解,是Lua入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-05-05
  • Lua和C++的通信流程分解

    Lua和C++的通信流程分解

    這篇文章主要介紹了Lua和C++的通信流程分解,本文用一張圖講解了Lua和C++之間的通信流程,并對(duì)每一步做了分解,需要的朋友可以參考下
    2014-09-09
  • Lua數(shù)據(jù)類型介紹

    Lua數(shù)據(jù)類型介紹

    這篇文章主要介紹了Lua數(shù)據(jù)類型介紹,本文講解了Lua中的nil(空)、boolean(布爾)、number(數(shù)字)、string(字符串)、table(表)、function(函數(shù))、thread(線程)、userdata(自定義類型)等數(shù)據(jù)類型,需要的朋友可以參考下
    2014-12-12

最新評(píng)論

白水县| 衡阳县| 德江县| 金坛市| 沁阳市| 三穗县| 潢川县| 巢湖市| 鄂尔多斯市| 明星| 安多县| 澄迈县| 顺昌县| 奈曼旗| 吉隆县| 灌云县| 宁蒗| 惠州市| 徐闻县| 邵阳市| 金秀| 乐昌市| 平泉县| 广水市| 桐城市| 遵义市| 昔阳县| 淮滨县| 太保市| 巴林左旗| 三都| 如东县| 茂名市| 青铜峡市| 多伦县| 文昌市| 昭觉县| 柏乡县| 大连市| 海安县| 桐庐县|