元表
任何的表都可以作为另一个表的元表
任何表都可以有自己的元表(父)
当子表进行一些特定操作时,会执行元表中的内容
利用元表的__index可以完成面向对象继承多态的实现
设置/获取元表setmetatable
meta = {}
myTable = {}
--设置元表,第一个参数为子表,第二个参数为元表(父)
setmetatable(myTable,meta)
--获取元表
getmetatable(myTable)
--不管元表,直接在目标表上查找数据,无视元表的__index
a = rawget(myTable,"age")
--直接设置目标表的数据,无视元表的__newIndex
rawset(myTable,"age",2)
特定操作-__tostring
meta2 = {
--当子表被当作字符串使用时,会默认调用元表中的__tostring方法
__tostring = function(t)
return t.name
end
}
myTable2 = {name = "你马屁"}
setmetatable(myTable2,meta2)
print(myTable2)
特定操作-__call
meta3 = {
--当子表被当作字符串使用时,会默认调用元表中的__tostring方法
__tostring = function(t)
return t.name
end,
--当子表被当作函数使用时,会默认调用元表中的__call方法
--第一个参数默认会传入自己
__call = function(a,b)
print(a)
print(b)
print("mmp")
end
}
myTable3 = {name = "你马屁"}
setmetatable(myTable3,meta3)
--114514将作为元表__call的第二个参数传入
--只有设置元表并实现__call才能将表作为函数调用
myTable3(114514)
特定操作-运算符重载
meta4 = {
--重载两个子表的加法运算
__add = function(t1,t2)
return t1.age + t2.age
end,
--重载减法
__sub = function(t1,t2)
return t1.age - t2.age
end
--其他:乘法__mul,除法__div,取余__mod,幂运算__pow,等于__eq,小于__lt,小于等于__le,无大于,拼接..__concat
--*重载条件运算符来比较两个对象,需要保证这两个对象的元表一定要一致,才能准确比较
}
myTable4 = {age = 1}
myTable5 = {age = 555}
setmetatable(myTable4,meta4)
print(myTable4 + myTable5) --=> 556
print(myTable4 - myTable5) --=> -554
特定操作-__index
meta6 = {age = 6}
--将meta6的__index指向meta6
--__index写在外部初始化,可以嵌套
meta6.__index = meta6
myTable6 = {}
setmetatable(myTable6,meta6)
--__index当子表中 找不到某一个属性时
--会到元表中 __index指定的表去找索引
--myTable6没有age,去myTable6元表的元表meta6的__index指向的表meta6中去找
print(myTable6.age)
特定操作-__newIndex
--__newIndex当赋值时,如果赋值一个不存在的索引
--会把这个值赋值到__newIndex所指的表中,不会修改自己
meta7 = {}
meta7.__newIndex = {}
myTable7 = {}
setmetatable(myTable7,meta7)
myTable7.age = 114514
print(myTable7.age)
评论(0)
暂无评论