Lua 的 setmetatable 函数

Lua 的 setmetatable 函数 是元表操作的核心函数之一,用于设置或修改表的元表。元表是 Lua 中实现面向对象编程和运算符重载的重要机制。

函数原型

lua 复制代码
setmetatable(table, metatable)
  • 参数:
    • table: 需要设置元表的表
    • metatable: 要设置的元表(可以是nil表示移除元表)
  • 返回值:返回第一个参数 table

功能说明

  1. 将第二个参数metatable设置为第一个参数table的元表
  2. 如果metatable包含__metatable字段,则会保护元表不被修改
  3. 如果metatablenil,则表示移除table的元表

示例用法

基本用法
lua 复制代码
local t = {}
local mt = {
    __index = function(t, k)
        return "default value"
    end
}
setmetatable(t, mt)
print(t.key)  -- 输出: "default value"
面向对象
lua 复制代码
local Person = {}
Person.__index = Person

function Person.new(name)
    local self = setmetatable({}, Person)
    self.name = name
    return self
end

function Person:sayHello()
    print("Hello, I'm "..self.name)
end

local p = Person.new("Alice")
p:sayHello()  -- 输出: Hello, I'm Alice
运算符重载
lua 复制代码
local Vector = {}
Vector.__index = Vector

function Vector.__add(a, b)
    return Vector.new(a.x + b.x, a.y + b.y)
end

function Vector.new(x, y)
    local v = {x = x, y = y}
    return setmetatable(v, Vector)
end

local v1 = Vector.new(1, 2)
local v2 = Vector.new(3, 4)
local v3 = v1 + v2  -- 调用__add元方法
print(v3.x, v3.y)   -- 输出: 4    6

注意事项

  1. 每个表只能有一个元表
  2. 使用getmetatable(table)可以获取表的元表
  3. 字符串、数字等基本类型也有元表,但通常不建议修改
  4. 元表修改会影响所有使用该元表的表实例

应用场景

  1. 实现面向对象编程中的类和继承
  2. 自定义表的访问和操作行为(通过__index__newindex等元方法)
  3. 运算符重载(如__add__mul等)
  4. 实现保护表(通过__metatable字段)
相关推荐
五仁烧饼4 分钟前
Unity性能优化系列内存篇 - 移动端内存优化
unity·性能优化·游戏引擎
SelectDB技术团队6 分钟前
StarRocks 适合做日志分析吗?
大数据·数据结构·后端·python·doris·日志分析·starrock
优化Henry7 分钟前
5G网络切片之S-NSSAIlist相关参数解析
运维·服务器·网络·笔记·学习·信息与通信
tju新生代魔迷14 分钟前
Verilog HDL学习笔记(六)| 第6章 数据流建模
笔记·学习
凯尔萨厮17 分钟前
Java学习笔记十二(异常与IO)
笔记·学习
一只旭宝18 分钟前
五种线程池设计
c++·笔记
luj_176823 分钟前
毒素驱动的生物自毁机制探析
服务器·c语言·开发语言·经验分享·算法
海兰31 分钟前
【 Python 量化交易】第6章:数据可视化
开发语言·python·信息可视化
多多鼠32 分钟前
Tool Calling的信任边界:从协议校验到执行沙箱的完整链路设计
运维·开发语言·网络·人工智能·python·langchain
啊阿狸不会拉杆35 分钟前
《计算机网络-自顶向下方法》1.5 协议层次及其服务模型 读书笔记
开发语言·计算机网络·php