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.