元表,即 Lua 中普通 table 的元数据表,而元方法则是元表中定义的普通表的默认行为。
Lua 中的每个普通 table 都可为其定义一个元表,用于扩展该普通 table 的行为功能。例如,
对于 table 与数值相加的行为,Lua 中是没有定义的,但用户可通过为其指定元表来扩展这
种行为;再如,用户访问不存在的 table 元素,Lua 默认返回的是 nil,但用户可能并不知道
发生了什么。此时可以通过为该 table 指定元表来扩展该行为:给用户提示信息,并返回用
户指定的值。
(1) 重要函数
元表中有两个重要函数:
setmetatable(table,metatable):将 metatable 指定为普通表 table 的元表。
getmetatable(table):获取指定普通表 table 的元表。
(2) _ index 元方法
当用户在对 table 进行读取访问时,如果访问的数组索引或 key 不存在,那么系统就会
自动调用元表的 index 元方法。该重写的方法可以是一个函数,也可以是另一个表。如果
重写的 _index 元方法是函数,且有返回值,则直接返回;如果没有返回值,则返回 nil。
元方法是一个函数如下:
--元表与元方法
t1 = {"a", age = 23,"b","c",name = "王五", "d",100}
--定义一个元表
meta = {}
--关联原始表和元表
setmetatable(t1,meta)
function meta.__index(tab,key)
print("key "..key.." 在原始表中不存在")
end
print(t1[99])
print(t1[100])
//输出结果如下:
key 99 在原始表中不存在
nil
key 100 在原始表中不存在
nil
元方法是另一个表如下
t1 = {"a", age = 23,"b","c",name = "王五", "d",100}
--定义一个元表
meta = {}
--定义一个元表
meta = {}
--定义另一个普通表
other = {}
other[99] = 999
other[100] = 1000
--关联原始表和元表
setmetatable(t1,meta)
meta.__index = other
print(t1[99])
print(t1[100])
//输出结果如下:
999
1000
标签:元表,15,--,t1,meta,key,table,方法
From: https://www.cnblogs.com/gom-linwei/p/18133287