跳转至

定义:元表 是定义了原始数据在某些事件下行为的一个普通 Lua 表。每个事件对应的键都是一个字符串,内容是以两个下划线做前缀的事件名,其相应的值被称为 元值(metavalue)。对于大部分事件,其元值必须是一个称为 元函数(metamethod) 的方法。 若非另有说明,元函数实际上可以是任意可调用的值,它要么是个函数,要么是个带有元方法“__call”的值。

  • getmetatable:查询元表
  • setmetatable:替换元表

默认情况下,值没有元表,但是字符串库给字符串类型设置了一个元表

对表设置原表

mytable = {}                          -- 普通表  
mymetatable = {}                      -- 元表  
setmetatable(mytable,mymetatable)     -- 把 mymetatable 设为 mytable 的元表

---缩写成一行
mytable = setmetatable({},{})

---返回对象元表
getmetatable(mytable) 

常用元方法

__index 元方法--用于对表访问

这是 metatable 最常用的键。 通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index 键。 * 如果 __index包含一个表格,Lua会在表格中查找相应的键。 * 如果__index包含一个函数的话,Lua就会调用那个函数,table和键会作为参数传递给函数。

mytable = setmetatable({key1 = "value1"}, {  
  __index = function(mytable, key)  
    if key == "key2" then  
      return "metatablevalue"  
    else  
      return nil  
    end  
  end  
})  

print(mytable.key1,mytable.key2)

Lua 查找一个表元素时的规则,其实就是如下 3 个步骤: * 查找table * 查找元表 * 元表中再查找__index

__newindex 元方法--对表更新

当你给表的一个缺少的索引赋值,解释器就会查找__newindex 元方法 * 如果不缺少索引,就直接赋值,否则: + 如果元方法存在且赋值为函数,则调用这个函数而不对原来的表进行赋值操作 * 如果元方法存在且赋值为表,则赋值给对应的表而不对原表进行赋值操作 *

__add,__sub,__mul等等--运算符重载(添加)

很明显咯,传入方法,参数就是运算符两边的东西

__Call 元方法--对表更新

Lua 调用一个值时调用。比如setmetatable的参数为({10},call=...}  那就是调用10的时候执行对应的方法。

__tostring元方法--用于修改表的输出行为

print(table)时调用