Lua 程式設計中的 __index 元方法
當我們在 Lua 中嘗試訪問表中未宣告的欄位時,得到的答案是 **nil**。雖然這是事實,但原因是當發生此類訪問時,直譯器會觸發對 **__index 元方法** 的搜尋,如果它沒有找到名為 **__index** 的方法,那麼我們將得到 **nil** 作為答案;否則,我們將獲得在 **__index 元方法** 中設定的欄位值的任何值。
我們可以顯式地將 **__index** 方法放入表中,並提供我們希望它返回的命名值,而不是 nil。
示例
讓我們考慮一個例子。我們將建立幾個描述視窗的表。每個表將描述幾個引數,如視窗的大小、高度、寬度;我們還將有一個預設建構函式來建立一個最初為空且所有欄位都未設定的表。
Window = {}
Window.prototype = {x=0, y=0, width=50, height=70, }
Window.mt = {}
function Window.new (o)
setmetatable(o, Window.mt)
return o
end
w = Window.new{x=10, y=20}
print(w.x)
print(w.width)
print(w.height)在上面的示例中,我們試圖列印視窗的三個不同欄位的值,即 **x**、**width** 和 **height**。我們知道,當我們使用建構函式建立一個新物件時,我們傳遞了 **x** 的值,因此 **x** 將不會是 nil,但由於我們沒有告訴 Lua 視窗物件 w 的 **width** 和 **height** 的值,因此我們將得到 nil。
輸出
10 nil nil
現在,我們可以在上面的程式碼中顯式地建立一個 **__index** 方法,以告訴直譯器,如果它在表中找不到該欄位,我們需要它返回我們的值而不是 nil。
示例
請考慮以下示例:
Window = {}
Window.prototype = {x=0, y=0, width=50, height=70, }
Window.mt = {}
function Window.new (o)
setmetatable(o, Window.mt)
return o
end
Window.mt.__index = function (table, key)
return Window.prototype[key]
end
w = Window.new{x=10, y=20}
print(w.x)
print(w.width)
print(w.height)輸出
10 50 70
廣告
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP