1. 基础用法
local t = {1,2,3}
local mt = {}
setmetatable(t, mt) -- 给 t 设置元表 mt
print(getmetatable(t) == mt) -- true
2. 常用元方法
(1)运算符重载(__add、__mul 等)local t1 = {1,2,3}
local t2 = {4,5,6}
local mt = {
__add = function(a, b)
local res = {}
for _,v in ipairs(a) do res[#res+1]=v end
for _,v in ipairs(b) do res[#res+1]=v end
return res
end
}
setmetatable(t1, mt)
local t3 = t1 + t2 -- 触发 __add
-- t3 = {1,2,3,4,5,6}
(2)索引访问(__index:查不到键时触发)local t = {name="Lua"}
local mt = {
__index = function(t, k)
return "默认值:"..k
end
}
setmetatable(t, mt)
print(t.name) -- Lua(自身有)
print(t.age) -- 默认值:age(触发 __index)
(3)赋值(__newindex:给不存在键赋值时触发)local t = {}
local mt = {
__newindex = function(t, k, v)
print("禁止赋值:"..k.."="..tostring(v))
end
}
setmetatable(t, mt)
t.age = 18 -- 禁止赋值:age=18(不实际写入)
(4)垃圾回收(__gc:对象被回收时触发)local t = {}
setmetatable(t, {
__gc = function()
print("对象被回收")
end
})
t = nil -- 解除引用
collectgarbage() -- 手动触发回收:对象被回收
|