Lua 的元表(metatable)机制可以用来实现类似"继承"的效果。下面这段示例展示了如何把一张表作为另一张表的元表,并借助 __index 字段让子表在查找不到字段时自动回落到父表。

示例代码

local a={x=5}

function a:func()
    print("func")
end

a.__index=a--

local b={t=6}

--[[
function b:func()
    print("func111")
end
--]]

setmetatable(b,a)-- 吧a设置为b的元表,b中未查找到 就到a中查找
--b相当于继承了a

print(b.x)

b.func()--如果b中没有func 那么调用a中的func

关键点解读

  • a.__index=a 让表 a 自己充当 __index 元方法的查找源,这样当子表找不到字段时,Lua 会转而去 a 中查找。
  • setmetatable(b,a)a 设置为 b 的元表,于是 b 就"继承"了 a 中定义的字段和方法。
  • print(b.x) 会输出 5,因为 b 本身没有 x,Lua 顺着元表链找到 a.x
  • b.func() 同理:b 没有定义 func,最终调用的是 a 中的 func