__index元方法

      我们知道当访问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

 

转载于:https://www.cnblogs.com/OrangeLife/p/4823321.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值