前面说过__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字段就会一直查找。
时间: 2024-10-14 08:16:52