欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Lua中的__index方法詳解

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

當(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)單的改寫為:

復(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ì)的討論繼承的方式。

相關(guān)文章

  • Lua中寫排序算法實(shí)例(選擇排序算法)

    Lua中寫排序算法實(shí)例(選擇排序算法)

    這篇文章主要介紹了Lua中寫排序算法實(shí)例,本文用一個(gè)選擇排序算法為例講解如何在Lua中寫一個(gè)排序算法,需要的朋友可以參考下
    2015-04-04
  • Lua中調(diào)用函數(shù)使用點(diǎn)號(hào)和冒號(hào)的區(qū)別

    Lua中調(diào)用函數(shù)使用點(diǎn)號(hào)和冒號(hào)的區(qū)別

    這篇文章主要介紹了Lua中調(diào)用函數(shù)使用點(diǎn)號(hào)和冒號(hào)的區(qū)別,本文涉及了Lua中面向?qū)ο蟮囊恍┑闹R(shí),并給出了一個(gè)簡(jiǎn)單的類代碼實(shí)例,需要的朋友可以參考下
    2014-09-09
  • Lua教程(六):編譯執(zhí)行與錯(cuò)誤

    Lua教程(六):編譯執(zhí)行與錯(cuò)誤

    這篇文章主要介紹了Lua教程(六):編譯執(zhí)行與錯(cuò)誤,本文講解了、C代碼、錯(cuò)誤、錯(cuò)誤處理與異常、錯(cuò)誤消息與追溯等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • Lua簡(jiǎn)介、編譯安裝教程及變量等語(yǔ)法介紹

    Lua簡(jiǎn)介、編譯安裝教程及變量等語(yǔ)法介紹

    這篇文章主要介紹了Lua簡(jiǎn)介、編譯安裝教程及變量等語(yǔ)法介紹,本文同時(shí)講解了lua注釋語(yǔ)法、Lua命令行方式等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • Openresty服務(wù)器使用lua腳本寫的Hello World簡(jiǎn)單實(shí)例

    Openresty服務(wù)器使用lua腳本寫的Hello World簡(jiǎn)單實(shí)例

    這篇文章主要介紹了Openresty服務(wù)器使用lua腳本寫的Hello World簡(jiǎn)單實(shí)例,OpenResty (也稱為 ngx_openresty)是一個(gè)全功能的 Web 應(yīng)用服務(wù)器。它打包了標(biāo)準(zhǔn)的 Nginx 核心,很多的常用的第三方模塊,以及它們的大多數(shù)依賴項(xiàng),需要的朋友可以參考下
    2015-04-04
  • Lua中的變量和流控制入門學(xué)習(xí)

    Lua中的變量和流控制入門學(xué)習(xí)

    這篇文章主要介紹了Lua中的變量和流控制入門學(xué)習(xí),其中--兩個(gè)橫線開(kāi)始單行的注釋,--[[加上兩個(gè)[和]表示多行的注釋--]],需要的朋友可以參考下
    2015-07-07
  • Lua中的閉包學(xué)習(xí)筆記

    Lua中的閉包學(xué)習(xí)筆記

    這篇文章主要介紹了Lua中的閉包學(xué)習(xí)筆記,閉包是可以包含自由(未綁定到特定對(duì)象)變量的代碼塊;這些變量不是在這個(gè)代碼塊內(nèi)或者任何全局上下文中定義的,而是在定義代碼塊的環(huán)境中定義(局部變量),需要的朋友可以參考下
    2014-12-12
  • Lua中的協(xié)同程序之resume-yield間的數(shù)據(jù)返回研究

    Lua中的協(xié)同程序之resume-yield間的數(shù)據(jù)返回研究

    這篇文章主要介紹了Lua中的協(xié)同程序之resume-yield間的數(shù)據(jù)返回研究本文講解了resume的參數(shù)、resume函數(shù)的第二個(gè)返回值、yield的返回值等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • 簡(jiǎn)單談?wù)刲ua和c的交互

    簡(jiǎn)單談?wù)刲ua和c的交互

    要理解Lua和C++交互,首先要理解Lua堆棧。簡(jiǎn)單來(lái)說(shuō),Lua和C/C++語(yǔ)言通信的主要方法是一個(gè)無(wú)處不在的虛擬棧。棧的特點(diǎn)是先進(jìn)后出。
    2016-01-01
  • Lua實(shí)現(xiàn)類繼承

    Lua實(shí)現(xiàn)類繼承

    這里給大家演示的是一個(gè)使用lua實(shí)現(xiàn)類繼承的示例,實(shí)現(xiàn)類繼承其實(shí)有很多種寫法,這里是本人常用的方法,推薦給大家。
    2015-03-03

最新評(píng)論