lua 元表操作

先来了解一下lua的元表操作:

在 Lua table 中我们可以访问对应的key来得到value值,但是却无法对两个 table 进行操作。

因此 Lua 提供了元表(Metatable),允许我们改变table的行为,每个行为关联了对应的元方法。

例如,使用元表我们可以定义Lua如何计算两个table的相加操作a+b。

当Lua试图对两个表进行相加时,先检查两者之一是否有元表,之后检查是否有一个叫"__add"的字段,若找到,则调用对应的值。"__add"等即时字段,其对应的值(往往是一个函数或是table)就是"元方法"。

有两个很重要的函数来处理元表:

  • setmetatable(table,metatable): 对指定 table 设置元表(metatable),如果元表(metatable)中存在 __metatable 键值,setmetatable 会失败。
  • getmetatable(table): 返回对象的元表(metatable)。

 

几个不太熟悉的元表方法:
rawget:rawget是为了绕过__index而出现的,直接点,就是让__index方法的重写无效
rawset:rawset是在设置值的过程,进行处理,比如:当某个值改变时,触发事件。或修改某个key为新值。
  1.__index元方法:
   setmetatable(tb, { __index = function()  return "not find"  end })
      local tb = {}
   setmetatable(tb, { __index = function() return "not find" end })
      tb.version = "正常版本"
      print(tb.version)
      print(tb.server) ---不存在的值,调用__index方法
           --rawget是为了绕过__index而出现的,直接点,就是让__index方法的重写无效
   print(rawget(tb, "version")) --打印 正常版本
      print(rawget(tb, "server")) --打印nil
  2.__newIndex 元方法:
   当对table中不存在的索引赋值时,解释器就会查找__newindex元方法。如果有这个元方法,就调用这个元方法,而不是执行复制。如果这个元方法是一个table,解释器就在table中进行复制,而不是对原来的table。

  MyMetatable = {}
  MyTable = setmetatable({["newKey"] = 12}, {__newindex = MyMetatable})
  MyTable.newKey1 = 156
  print(MyTable.newKey1) --- nil
  print(MyMetatable.newKey1) --- 156

  

  

 
  
    
 
 

posted on 2020-03-25 18:07  123_123  阅读(635)  评论(0编辑  收藏  举报