作用:使两个表关联起来,实现一些自定义化的功能扩展,下面就是些常用扩展
1. __index(实现类似继承的效果)
访问时,若当前表无此字段,则去元表中找
local t1 = {}
t1.a = 123
local t2 = {}
setmetatable(t2, {__index = t1})
local t3 = setmetatable({}, {__index = t2})
print(t3.a)
输出结果(123)
-元表具有链式关联性,即:关联了多级元表会一直往上查(如上所示)
2. __newindex(自定义控制,添加新元素)
local t1 = {}
t1.a = 123
local t2 = {}
setmetatable(t2, {__index = t1})
local t3 = setmetatable({}, {__index = t2, __newindex =
function() print("禁止添加新元素") end})
t3.b = 1
print(t3.b)
输出结果(禁止添加新元素, nil)
3. 表与表的运算,下面是加法的实例,其他运算符类似
local t1 = {}
t1.a = 123
local t2 = {a = 456}
setmetatable(t2, {__add = function(thisTable, otherTable)
return thisTable.a + otherTable.a
end})
print(t1 + t2)
输出结果(579)
罗列一下(__add,__sub,__mul,__div,
__mode,__unm(负数符号,取反),__concat(..字符串拼接)
__eq(==),__lt(<),__le(<=)
__tonumber(tonumber)
4. __call(可实现类似C++里的构造函数,当然也可以自定义其他),特点是table自身当做方法调用
local t1 = {}
t1.a = 123
local t2 = {a = 456}
setmetatable(t2, {__call = function(thisTable)
return setmetatable({}, {__index = t2})
end})
local newT2 = t2()
print(t2, newT2, newT2.a)
输出结果(table: 0x120d3c0table: 0x120c940456)
5. __tostring,序列化,用于重写print(table)
local t1 = {}
t1.a = 123
local t2 = {a = 456}
setmetatable(t2, {__tostring = function(thisTable)
return "a = "..thisTable.a
end})
print(t2)
输出结果(a = 456)
6. __mode,弱表,定义为弱表的内容,有引用也可被回收,取值哦(k(key弱), v(v弱), kv(一个被回收,两个都从表里删除))
-- 创建弱表
local tbl = {}
setmetatable(tbl, {__mode = "k"})
local key = {count = 100}
tbl[key] = 1
key = {}
tbl[key] = 2
-- 强制垃圾收集
collectgarbage()
for k,v in pairs(tbl) do
print(k, v, k.count)
end
输出结果(table: 0xe0e8c02nil)
-当关联了元表,又想对原始表操作,怎么办?
rawset/get:对表的原始数据操作,忽略元表
参考:https://www.runoob.com/lua/lua-tutorial.html
原文:https://www.cnblogs.com/hiker-online/p/13583723.html