作用
子表执行特定操作 会执行元表中的方法
元表类似子表的父亲
元表是表
元表设置和获取
meta={}
myTable={}
参数1子表 参数 2 元表
setmetatable(myTable,meta)
参数 子表
getmetatable(myTable)
元表特定操作
- __tostring 注意:前面两个下划线
meta2={
当子表作为字符串使用时候 会调用该方法
__tostring=function()
return “tostring”
end
}
myTable2={}
setmetatable(myTable2,meta2)
print(myTable2)–调用__tostring - __call
meta3={
当子表作为函数使用时候 会调用该方法
__call=function (t,a)
print(t)
print(a)
end
}
myTable3={}
setmetatable(myTable3,meta3)
myTable3(2)–当作函数使用时候 第一个参数默认是表本身 参数二 传入的参数 - 运算符重载
meta4={
子表使用+运算符 调用该方法
__add =function(t1,t2)–加法
return t1.age+t2.age
end,
子表使用==运算符 调用该方法
__eq=function(t1,t2)-- == 是否相等
return true
}
myTable4={age=1}
myTable5={age=5}
setmetatable(myTable4,meta4)
setmetatable(myTable5,meta4)
print(myTable4+myTable5)
注意:用条件运算符比较对象 两个表的元表一样
print(myTable4==myTable5)
其他关键字:__sub减、__mul乘、__div除、__mod取余、__pow幂运算、__lt小于、__le小于等于、__concat拼接
4.__idnex
在子表中找不到指定属性 会到元表中__index指定的表中查找属性 没有返回nil
meta6={age=1}
myTable6={}
meta6.__index=meta6 注意:__index写在表外初始化
setmetatable(myTable6,meta6)
print(myTable6.age)
rawget不查找元表 在自己的表中查找该属性 不受__index影响
print(rawget(myTable4,“age”)) - __newIndex
被赋值时 如果赋值给一个不存在的索引 会把值赋值到newindex指向的表中 不会改变自己
meta7={}
meta7.__newindex={}
myTable7={}
setmetatable(myTable7,meta7)
myTable7.age=5 age属性未添加入表中
print(myTable7.age) nil
rawset 赋值给子表 不受到__newindex的影响
rawset(myTable7,“age”,2)