Lua中rawset和rawget的作用浅析
rawget是为了绕过__index而出现的,直接点,就是让__index方法的重写无效。(我这里用到"重写"二字,可能不太对,希望能得到纠正)
Window={} Window.prototype={x=0,y=0,width=100,height=100,} Window.mt={} functionWindow.new(o) setmetatable(o,Window.mt) returno end Window.mt.__index=function(t,key) return1000 end Window.mt.__newindex=function(table,key,value) ifkey=="wangbin"then rawset(table,"wangbin","yes,iam") end end w=Window.new{x=10,y=20} print(rawget(w,w.wangbin))
打印结果是:nil。这里的元表中__index函数就不再起作用了。
但是rawset呢,起什么作用呢?我们再来运行一段代码。
Window={} Window.prototype={x=0,y=0,width=100,height=100,} Window.mt={} functionWindow.new(o) setmetatable(o,Window.mt) returno end Window.mt.__index=function(t,key) return1000 end Window.mt.__newindex=function(table,key,value) table.key="yes,iam" end w=Window.new{x=10,y=20} w.wangbin="55"
然后我们的程序就stackoverflow了。可见,程序陷入了死循环。因为w.wangbin这个元素本来就不存在表中,然后这里不断执行进入__newindex,陷入了死循环。