标签:
我们知道当访问table里一个不存在的字段时会返回nil,这不完全正确。实际上,当我们访问一个不存在的字段时,会去查找一个__index的元方法。如果没有这个元方法,那么返回nil,如果有,那么就由这个元方法提供最后的结果。
举个栗子:
window = {} window.prototype = {x = 20, y = 30, width = 100, height = 200} window.mt = {} window.new = function(o) setmetatable(o,window.mt) return o end window.mt.__index = function(table,key) return window.prototype[key] end w = window.new{x= 50, y = 60} print(w.width) -->100
我们定义一个表w,表里只有x,y2个字段。此时我们去查找w.width是查找不到的,于是去查找它的元方法,即__index.它返回了prototype[width],于是返回了100.
__index也可以是个table,可以改写成以下:
window.mt.__index = window.prototype
补充一点,如果想要“绕过”这个__index,可以用rawget方法
print(rawget(w,w.width)) -->nil
标签:
原文地址:http://www.cnblogs.com/OrangeLife/p/4823321.html