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

Lua中的__index方法詳解

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

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

這個例子的原型是一種繼承。假設(shè)我們想創(chuàng)建一些表來描述窗口。每一個表必須描述窗口的一些參數(shù),比如:位置,大小,顏色風格等等。所有的這些參數(shù)都有默認的值,當我們想要創(chuàng)建窗口的時候只需要給出非默認值的參數(shù)即可創(chuàng)建我們需要的窗口。第一種方法是,實現(xiàn)一個表的構(gòu)造器,對這個表內(nèi)的每一個缺少域都填上默認值。第二種方法是,創(chuàng)建一個新的窗口去繼承一個原型窗口的缺少域。首先,我們實現(xiàn)一個原型和一個構(gòu)造函數(shù),他們共享一個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)建一個新的窗口,然后訪問他缺少的域結(jié)果如下:
復(fù)制代碼 代碼如下:

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將在這個表中看是否有缺少的域。所以,上面的那個例子可以使用第二種方式簡單的改寫為:

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

Window.mt.__index = Window.prototype

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

Window.prototype["width"]

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

相關(guān)文章

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

    Lua中string.len()使用指南

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

    Lua中的閉包小結(jié)

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

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

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

    Lua中字符串(string)淺析

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

    Lua中獲取table長度問題探討

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

    lua日志文件處理代碼

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

    Lua中的異常處理pcall、xpcall、debug使用實例

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

    Lua中break語句的使用方法詳解

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

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

    這篇文章主要介紹了Lua和C++的通信流程分解,本文用一張圖講解了Lua和C++之間的通信流程,并對每一步做了分解,需要的朋友可以參考下
    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

最新評論

饶河县| 彭水| 句容市| 亚东县| 秭归县| 武强县| 青铜峡市| 重庆市| 龙泉市| 郴州市| 姚安县| 昆山市| 宜州市| 榆林市| 常德市| 新和县| 陵川县| 海兴县| 六枝特区| 加查县| 军事| 天长市| 利辛县| 宁陵县| 读书| 临朐县| 界首市| 兰州市| 宁安市| 苍梧县| 东城区| 禹城市| 喀喇| 滨州市| 漯河市| 油尖旺区| 郴州市| 阿拉尔市| 重庆市| 顺义区| 丹巴县|