1.概念(父子表)
任何表变量都可以作为另一个表变量的元表
任何表变量都可以有自己的元表
当在子表中进行一些特定操作的时候,会执行元表中的内容
2.设置
①声明两张表
meta={
}
mytable={
}
②设置元表
setmetatable(mytable,meta) arg1为子表,arg2为元表
3.操作
①__tostring:当子表要被当作字符串使用时,会默认调用 元表中的__tostring方法
meta2={
__tostring=function()
return "onestring"
end
}
mytable2={
}
setmetatable{
mytable2,meta2}
print(mytable2) 会打印onestring,
当知道子表中有那些属性的时候
meta3={
__tostring=function(sonTable)
return sonTable.name
end
}
mytable3={
name="xxx"
}
setmetatable(mytable3,meta3)
print(mytable3) 元表中的_tostring中的方法需要的参数,调用会把mytable3当作参数传进去
②__call:当子表被当作函数使用时候,会调用__call
meta4={
__call=function()
print("Be called")
end
}
mytable4={
}
setmetatable(mytable4,meta4)
mytable4() 会输出Be called
注意:
无论是__call --tostring 第一个参数都是子表自己本身
表本身,是不允许当作一个方法进行调用的,要关联一个元表,并且在元表中实现了__call才允许本当作方法使用
③运算符重载:运算符关键字 __add,__sub,__mul, __div,__mod(取余),__pow(^幂),__eq(==),__lt(<),__le(<=)条件运算符只有< <= == 另外条件运算符使用的时候比较的两个表的元表必须一致才能准确调用,__concat(…)
meta5={
}
mytable5={
}
mytable6={
}
setmetatable(mytable5,meta5)
print(mytable5+mytable5)会报错
在meta5重载+运算符
meta5=