Lua 的 setmetatable 函数 是元表操作的核心函数之一,用于设置或修改表的元表。元表是 Lua 中实现面向对象编程和运算符重载的重要机制。
函数原型
lua
setmetatable(table, metatable)
功能说明
- 将第二个参数metatable设置为第一个参数table的元表
- 如果
metatable包含__metatable字段,则会保护元表不被修改 - 如果
metatable为nil,则表示移除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
注意事项
- 每个表只能有一个元表
- 使用
getmetatable(table)可以获取表的元表 - 字符串、数字等基本类型也有元表,但通常不建议修改
- 元表修改会影响所有使用该元表的表实例
应用场景
- 实现面向对象编程中的类和继承
- 自定义表的访问和操作行为(通过
__index、__newindex等元方法) - 运算符重载(如
__add、__mul等) - 实现保护表(通过
__metatable字段)