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

Lua中的__index方法詳解

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

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

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

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

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

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

復制代碼 代碼如下:

Window.mt.__index = Window.prototype

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

Window.prototype["width"]

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

相關文章

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

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

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

    Lua中調用函數(shù)使用點號和冒號的區(qū)別

    這篇文章主要介紹了Lua中調用函數(shù)使用點號和冒號的區(qū)別,本文涉及了Lua中面向對象的一些的知識,并給出了一個簡單的類代碼實例,需要的朋友可以參考下
    2014-09-09
  • Lua教程(六):編譯執(zhí)行與錯誤

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

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

    Lua簡介、編譯安裝教程及變量等語法介紹

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

    Openresty服務器使用lua腳本寫的Hello World簡單實例

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

    Lua中的變量和流控制入門學習

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

    Lua中的閉包學習筆記

    這篇文章主要介紹了Lua中的閉包學習筆記,閉包是可以包含自由(未綁定到特定對象)變量的代碼塊;這些變量不是在這個代碼塊內或者任何全局上下文中定義的,而是在定義代碼塊的環(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ù)的第二個返回值、yield的返回值等內容,需要的朋友可以參考下
    2014-09-09
  • 簡單談談lua和c的交互

    簡單談談lua和c的交互

    要理解Lua和C++交互,首先要理解Lua堆棧。簡單來說,Lua和C/C++語言通信的主要方法是一個無處不在的虛擬棧。棧的特點是先進后出。
    2016-01-01
  • Lua實現(xiàn)類繼承

    Lua實現(xiàn)類繼承

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

最新評論