源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Lua中rawset和rawget的作用浅析

  • 时间:2020-07-15 04:24 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Lua中rawset和rawget的作用浅析
rawget是为了绕过__index而出现的,直接点,就是让__index方法的重写无效。(我这里用到"重写"二字,可能不太对,希望能得到纠正)
[u]复制代码[/u] 代码如下:
Window = {}    Window.prototype = {x = 0 ,y = 0 ,width = 100 ,height = 100,}  Window.mt = {}  function Window.new(o)      setmetatable(o ,Window.mt)      return o  end  Window.mt.__index = function (t ,key)      return 1000  end  Window.mt.__newindex = function (table ,key ,value)      if key == "wangbin" then          rawset(table ,"wangbin" ,"yes,i am")      end  end  w = Window.new{x = 10 ,y = 20}  print(rawget(w ,w.wangbin)) 
打印结果是:nil。这里的元表中__index函数就不再起作用了。 但是rawset呢,起什么作用呢?我们再来运行一段代码。
[u]复制代码[/u] 代码如下:
Window = {}  Window.prototype = {x = 0 ,y = 0 ,width = 100 ,height = 100,}  Window.mt = {}  function Window.new(o)      setmetatable(o ,Window.mt)      return o  end  Window.mt.__index = function (t ,key)      return 1000  end  Window.mt.__newindex = function (table ,key ,value)      table.key = "yes,i am"  end  w = Window.new{x = 10 ,y = 20}  w.wangbin = "55" 
然后我们的程序就stack overflow了。可见,程序陷入了死循环。因为w.wangbin这个元素本来就不存在表中,然后这里不断执行进入__newindex,陷入了死循环。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部