每当我们尝试访问 Lua 中尚未在表中声明的字段时,我们得到的答案是nil。虽然这是真的,但原因是当这种访问发生时,解释器会触发对__index 元方法的搜索,如果它没有找到任何名为__index 的方法,那么我们得到nil作为答案;否则我们将获得在__index 元方法中设置的字段值。
我们可以显式地将__index方法放入一个表中,并为它提供我们希望它返回的命名值而不是 nil。
让我们考虑一个例子。我们将创建几个描述窗口的表格。每个表格将描述几个参数,如窗口的大小、高度、宽度;我们还将有一个默认构造函数来创建一个最初为空且所有字段都未设置的表。
Window = {} Window.prototype = {x=0, y=0, width=50, height=70, } Window.mt = {} functionWindow.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)
在上面的例子中,我们试图打印 Window 三个不同字段的值,x,width和height。我们知道,当我们使用构造函数创建一个新对象时,我们传递了x的值,所以x不会为 nil,但是由于我们没有告诉 Lua窗口对象 w的宽度和高度的值,我们将为零。
输出结果
10 nil nil
现在,我们可以在上面的代码中显式地创建一个__index方法来告诉解释器我们需要它返回我们的值而不是 nil,以防它在表中找不到字段。
考虑下面显示的例子 -
Window = {} Window.prototype = {x=0, y=0, width=50, height=70, } Window.mt = {} functionWindow.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