—— 元表 ——
—— 元表的概念
— 任何表变量都可以作为另一个变量的元表
— 任何表变量都可以拥有自己的元表 (父亲)
— 当在子表(原本的表)中进行一些特定操作时
— 会执行元表中的内容
—— 设置元表
meta = {}
_tab = {}
— 第一个参数 子表
— 第二个参数 元表
setmetatable(tab, meta)
print(“####====tostring====####”)
— tostring
meta2 = {
— 当子表要被当作字符串使用时,会默认调用这个元表中的tostring方法
_tostring = function()
return “meta2 tostring”
end
}
_tab2 = {}
setmetatable(tab2, meta2)
print(tab2) —> meta2 tostring
meta3 = {
tostring = function(t)
return t.name
end
}
tab3 = { name = “tab 3” }
setmetatable(tab3, meta3)
print(tab3) —> tab 3
print(“####====call====####”)
— call
meta4 = {
call = function()
print(“meta4 call”)
end
}
tab4 = {}
setmetatable(tab4, meta4)
— 当子表被当作一个函数使用时,调用元表的call方法
tab4() —> meta4 call
———————————————————————
meta5 = {
tostring = function(t)
return t.name
end,
call = function(i, j)
— 第一个参数为表本身,第二个参数为传入参数
print(i, j)
end
}
tab5 = {
name = “tab5-name”
}
setmetatable(tab5, meta5)
tab5(5) —> tab5-name 5
print(“####====运算符重载====####”)
—— 运算符重载
— 加法 add +
— 减法 sub -
— 乘法 mul *
— 除法 div /
— 取余 mod %
— 求幂 pow ^
— 相等 eq ==
— 小于 lt <
— 小于等于 le <=
— 连接 concat ..
meta6 = {
— 表间加法
add = function(t1, t2)
return t1.age + t2.age
end,
— 表间减法
sub = function(t1, t2)
return t1.age - t2.age
end,
— 相等
eq = function(t1, t2)
return t1.age == t2.age
end
}
tab6 = { age = 3 }
tab7 = { age = 5 }
setmetatable(tab6, meta6)
print(tab6 + tab7) —> 8
print(tab7 - tab6) —> 2
tab8 = { age = 3 }
print(tab6 == tab7) —> false
print(tab6 == tab8) —> true
print(“####====index====####”)
_—— index 和 newindex
_— index 当子表中找不到某一个属性时,会到元表中 index指定的表去找索引
meta9 = {
key = 1,
— 这种写法无效,建议将index的赋值写在表外进行初始化
— index = meta9
}
meta9.index = meta9
tab9 = {}
setmetatable(tab9, meta9)
print(tab9.key) —> 1
— index可以向上套用
meta10 = {}
meta10.index = meta10
tab10 = {}
meta10meta = { — meta10的元表
key = 1
}
meta10meta.index = meta10meta
_setmetatable(_tab10, meta10)
setmetatable(meta10, meta10meta)
— tab10.key最终在meta10meta中找到
print(tab10.key) —> 1
print(“####====newindex====####”)
—— newindex 当赋值时,如果赋值一个不存在的索引
—— 那么会把这个值赋到newindex所指的表中,不会修改子表
tab11 = {}
meta11 = {}
setmetatable(tab11, meta11)
tab11.age = 1
print(tab11.age) —> 1
tab12 = {}
meta12 = {}
meta12.newindex = {}
setmetatable(tab12, meta12)
tab12.age = 1
print(tab12.age) —> nil
print(meta12.newindex.age) —> 1
— newindex与index相同,可以向上嵌套 暂不做演示
print(“####====getmetatable====####”)
—— 获取元表的方法getmetatable
_print(getmetatable(_tab12))
print(“####====rawget====####”)
—— rawget 找子表的变量,无视元表的index
_print(rawget(_tab12, “age”)) —> nil
—— rawset 更改子表变量值,无视元表的newindex
_print(“####====rawset====####”)
rawset(_tab12, “age”, 3)
print(rawget(tab12, “age”)) —> 3