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

更新於: 2021-07-19

1K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.