一天三盒半 发表于 2026-5-27 14:13:41

Lua 高级教程——元表(Metatable)与元方法(Metamethod)

1. 基础用法

local t = {1,2,3}
local mt = {}
setmetatable(t, mt)-- 给 t 设置元表 mt
print(getmetatable(t) == mt)-- true2. 常用元方法
(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()-- 手动触发回收:对象被回收

页: [1]
查看完整版本: Lua 高级教程——元表(Metatable)与元方法(Metamethod)