教程 lua tutorial

元表与元方法

Lua 的 元表(Metatable) 是表的元信息,它允许你 自定义表的行为,如重载运算符、改变索引访问、控制方法调用等。元表中的特殊函数称为 元方法(Metamethod)。

🧩 基本用法

lua
local t = {}
local mt = {}

setmetatable(t, mt)

`

setmetatable(table, metatable) 将元表关联到目标表。

🔗 __index 元方法

当访问表中不存在的字段时,会触发 __index。

lua
local t = {}
local mt = {
  __index = function(table, key)
    return key .. " 不存在"
  end
}

setmetatable(t, mt)

print(t.name)  -- 输出:name 不存在

__index 也可以是另一个表,实现类似继承。

➕ 运算符重载

Lua 支持通过元方法重载运算符,如 +、-、*、.. 等。

lua
local t1 = {x = 1, y = 2}
local t2 = {x = 3, y = 4}

local mt = {
  __add = function(a, b)
    return { x = a.x + b.x, y = a.y + b.y }
  end
}

setmetatable(t1, mt)
setmetatable(t2, mt)

local t3 = t1 + t2
print(t3.x, t3.y)  -- 输出 4 6

🧱 __tostring 元方法

自定义表的字符串表示:

lua
local t = {x = 10, y = 20}
local mt = {
  __tostring = function(tbl)
    return "(" .. tbl.x .. "," .. tbl.y .. ")"
  end
}
setmetatable(t, mt)

print(t)  -- 输出:(10,20)

🧩 面向对象示例

lua
local Person = {}
Person.__index = Person

function Person:new(name, age)
  local obj = {name = name, age = age}
  setmetatable(obj, self)
  return obj
end

function Person:greet()
  print("Hello, " .. self.name)
end

local p = Person:new("Alice", 20)
p:greet()  -- 输出:Hello, Alice

元表配合 __index 可实现简单的面向对象机制。

🧠 小结

  • 元表(Metatable)定义表的元行为
  • 常用元方法:__index、__newindex、__add、__tostring 等
  • 可实现运算符重载、继承和面向对象
  • Lua 的高级技巧很多都依赖元表实现