__newindex

前面说过__index,与__index不同的是,__newindex用于更新,而__index用于查找。当对一个table不存在的字段进行赋值时,就会查找__newindex元方法。如果存在这个元方法,就执行它。如果这个元方法是table,那么久对此table赋值,而不是原table。

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 = window.prototype
window.mt.__newindex = function(table,key,value)
     print("excu  __newindex....")
end


w = window.new{x= 50, y = 60}
print(rawget(w,w.width))   -->nil
w.xy = 40    -->excu  __newindex....

w中并不存在字段xy,因此执行__newindex方法

 

如果想对xy字段赋值,则修改__newindex方法如下:

mt.__newindex = function(table,key,v)

    rawset(t,key,v)
end

这里需要使用rawset,如果不这样,而进行直接赋值,则会陷入死循环,因为不存在xy字段就会一直查找。

 

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值