元表概念
-- 任何 表变量 都可以作为另一个表变量的元表
-- 任何 表变量 都可以有自己的元表(继承(浅拷贝))
-- 当我们子表中进行一些特定操作时
-- 会执行元表中的内容
设置元表
设置元表的公共方法
setmetatable(被设置的表,元表)
getmetatable 得到元表,判断是否有元表
meta ={}
myTable={}
--设置元表函数
--第一个参数 需要被设置的表
--第二个参数 元表(继承)
setmetatable(myTable,meta)
-- 得到元表的方法 --可以判断是否有元表
print(getmetatable(myTable))
关于元表——元方法
特定操作-__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 =function(t,t2)
--当子表被当作一个函数来使用时 会默认调用这个_call中的内容
print("白芷,欢迎回归",t,t2)
end
}
myTable3={
name = "欢迎光临"
}
--设置元表函数
--第一个参数 子表
--第二个参数 元表(继承)
setmetatable(myTable3,meta3)
--把子表当作函数使用 就会调用元表的__call方法
myTable3(1)
特定操作-运算符重载
meta4 ={
-- 相当于 运算符重载 当子表使用 + 运算符 会调用该方法
-- 运算符+
__add = function(t1,t2)
return t1.age+t2.age
end,
-- 运算符-
__sub = function(t1,t2)
return t1.age-t2.age
end,
-- 运算符*
__mul = function(t1,t2)
return t1.age*t2.age
end,
-- 运算符/
__div = function(t1,t2)
return t1.age/t2.age
end,
-- 运算符%
__mod = function(t1,t2)
return t1.age%t2.age
end,
-- 运算符^
__pow = function(t1,t2)
return t1.age^t2.age
end,
-- 运算符==
__eq = function(t1,t2)
return t1.age==t2.age
end,
-- 运算符<
__lt = function(t1,t2)
return t1.age<t2.age
end,
-- 运算符<=
__le = function(t1,t2)
return t1.age<=t2.age
end,
-- 运算符 ..
__concat = function(t1,t2)
return t1.age..t2.age
end,
}
mytable4= { age=3 }
setmetatable(mytable4,meta4)
mytable5 ={ age=3 }
setmetatable(mytable5,meta4)
print(mytable4 + mytable5)
print(mytable4 - mytable5)
print(mytable4 * mytable5)
print(mytable4 / mytable5)
print(mytable4 % mytable5)
print(mytable4 ^ mytable5)
-- 如果要用条件运算符 来比较两个对象
-- 这两个对象的元表一定要一致 才能准确调用方法
print(mytable4 == mytable5)
print(mytable4 < mytable5)
print(mytable4 <= mytable5)
print(mytable4 .. mytable5)
特定操作-_index和_newIndex
meta6Father ={
age = 9
}
meta6Father.__index=meta6Father
meta6 ={
--age=1,
-- 第三种赋值 (不推荐使用)
--__index={age=6}
}
-- __index的赋值 写在表外面来初始化
-- 第一种修改
meta6.__index = meta6
-- 第二种修改
--meta6.__index = {age=3}
myTable6={}
setmetatable(meta6,meta6Father)
setmetatable(myTable6,meta6)
--__index 当子表中 找不到某一个属性时
--会到元表中 __index 指定的表去找属性 _index 一般会指向一个表
-- 如果_index 的表中也没有找到 会往上 也就是__index指向的元表的元表的__index中去找
-- 完全找不到 返回nil
print(myTable6.age)
-- rawget 当我们使用它时 只会去找自己身上有没有这个变量
print(rawget(myTable6 , "age"))
--newIndex 当赋值时,如果赋值一个不存在的索引
--那么会把这个值赋值到newindex所指的表中 不会修改自己
meta7 ={}
meta7.__newindex ={}
myTable7 ={}
setmetatable(myTable7,meta7)
myTable7.age=1
print(myTable7.age)
-- 注意要从元表的__newindex 来找值不能从子表
--print(meta7.__newindex.age)
--rawset 该方法 会忽略newindex的设置 只会改自己的变量
rawset(myTable7,"age",2)
print(myTable7.age)
更详细的介绍
https://www.cnblogs.com/blueberryzzz/p/8947446.html