脚本小子_Lua元表与元方法

一、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)
   

猜你喜欢

转载自blog.csdn.net/u014795720/article/details/80210750
今日推荐