查看: 28|回复: 0

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

[复制链接]

48

主题

75

回帖

1991

积分

金牌会员

积分
1991
QQ
发表于 2026-5-27 14:13:41 | 显示全部楼层 |阅读模式
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()  -- 手动触发回收:对象被回收

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表