元表主要是控制对象在如:算术运算、顺序比较、连接、长度运算、索引、调用以及其他操作的行为,他以普通的TABLE方式存在,简单的说就是对特定的名称赋于方法(函数)来控制特定的操作。你不能从 Lua 中改变TABLE之外其它任何类型的值的 metatable , 要这样做的话必须使用 C API 。
--你可以通过 getmetatable 函数来查询 table 的 metatable。
strmt = getmetatable(tabname)
--你可以通过 setmetatable 函数来替换 table 的 metatable 。
setmetatable({},{})
--直接获取table 本身的内容,不运行__index元方法
rawget (table, key)
--直接赋值table 本身的内容,不运行__newindex元方法
rawset (table, key, value)
--示例
mytable={}
setmetatable(mytable,{})
strmt = getmetatable(mytable)
__index 元方法
--获取 TABLE 中没有的KEY , LUA会在__index里找
mytab = {}
print(mytab.x) --nil
mymetatab = {__index={x=1;}}
setmetatable(mytab,mymetatab)
print(mytab.x) --1
__newindex 元方法
--赋予TABLE 中没有的 KEY , LUA会在 __newindex里找
mytab = {}
mymetatab = {
__newindex=function(t,k,v)
print("没有在TABLE找到对应的"..k)
end
}
setmetatable(mytab,mymetatab)
__call 元方法
--当table 当成表达式使用的时候 lua会查找__call 元方法
mytab = {}
mymetatab = {
__call=function(_,t)
print("表达式调用成功!")
end
}
setmetatable(mytab,mymetatab)
mytab()
元方法列表
__index | 对应访问值table[key]或table.key |
__newindex | 对应赋值 table[key]=val或table.key=val |
__call | 对应函数运行 table() |
__add | 对应的运算符 ‘+’ |
__sub | 对应的运算符 ‘-’ |
__mul | 对应的运算符 ‘*’ |
__div | 对应的运算符 ‘/’ |
__mod | 对应的运算符 ‘%’ 求余 |
__pow | 对应的运算符 ‘^’ 幕操作 |
__unm | 对应的一元运算符 ‘-’,负数 |
__concat | 对应的运算符’..’ 连接操作 |
__eq | 对应的运算符’==’ 比较操作 |
__lt | 对应的运算符’<’ |
__le | 对应的运算符’<=’ |