一、Lua元表与元方法
Lua中每种类型都有其对应的取值范围和对应的操作方法。比如整形,只能取数字值和其操作方法: 加减乘除。但是,在操作table类型时,却无法将两个table相加,因为table没有定义相加的操作。而元表则是来补充这块的不足。元表可以通过修改一个值得行为,使其在面对一个非预定义的操作时,去执行一个指定的操作。比如,定义好table,相加这个操作的元表。当table a+b操作时,lua解析器就是判断两者之一是否有定义该操作的元表。如果找到,则执行该定义的方法。如无则提示对应的提示信息。
1、元表与元方法
从上面的说明,可以知道,元表是补充内置没有定义的方法。但是其元表本身是k-v的类型,k只能是内置属性描述字符,而v则只能是具体的操作方法。则该值就是所谓的"元方法",Lua中的每个值都有一个元表。table和userdata都有各自独立的元表,而其它类型的值则共享其类型所属的单一的元表。而lua中创建table时是不会帮其创建元表
2、setmetatable和getmetatable、__metatable
- setmetatable设置元表,格式 setmetatable(table,table1)
- getmetatable获取元表,格式 getmetatable(table)
- __metatable设置元表的元表,禁止元表设置
2.1、例子
local t = {}
print(getmetatable(t))
local t1 = {}
setmetatable(t,t1)
print(getmetatable(t) == t1)
local t = {}
setmetatable(t,{__metatable = "not to do."})
setmetatable(t,{})
3、元表类型
3.1、算术类型
属性值
|
作用
|
__add
|
相加,格式 function(table1,table2)
|
__mul
|
相乘,格式 function(table1,table2)
|
__sub
|
相减,格式 function(table1,table2)
|
__div
|
相除,格式 function(table1,table2)
|
__unm
|
相反数,格式 function(table1,table2)
|
__mod
|
取模,格式 function(table1,table2)
|
__pow
|
乘幂,格式 function(table1,table2)
|
3.2、关系类型
属性值
|
作用
|
__eq
|
等于,格式 function(table1,table2)
|
__lt
|
小于,格式 function(table1,table2)
|
__le
|
小于等于,格式 function(table1,table2)
|
备注: 关系类型中没有其它像不等于、大于、大于等于。lua都会转换成上述三种。
3.3、table访问的元方法
属性值
|
作用
|
__index
|
table引用索引时,调用,格式 function(table1,k)
|
__newindex
|
table对不存在的属性赋值时,调用,格式 function(table1,k,v)
|
3.4、其它操作
属性值
|
作用
|
__call
|
tabled调用一个值时,调用。格式 function(table1,table2)
|
__tostring
|
修改表的输出行为
时,调用,格式 function(table1)
|