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。