元表可以修改一个值的行为,使其在面对一个非预定义的操作时执行一个指定操作。
元方法会检测一个操作中的值是否有元表,以及元表是否定义了操作的元方法。如两个table相加,先检查两者之一是否有元表,之后检查是否有一个叫“__add”的字段,若找到,则调用对应的值。“__add”等字段,其对应的值(一般是一个函数或是table)就是“元方法”。
元方法会检测一个操作中的值是否有元表,以及元表是否定义了操作的元方法。如两个table相加,先检查两者之一是否有元表,之后检查是否有一个叫“__add”的字段,若找到,则调用对应的值。“__add”等字段,其对应的值(一般是一个函数或是table)就是“元方法”。
1、元表定义
元表是普通的Lua表。元表中的键为事件(event),称值为元方法(metamethod),通过设置特定的字段来改变作用于该值的操作的某些行为特征。
例如,当数字值作为加法的操作数时,Lua检查其元表中的"__add"字段是否有个函数。如果有,Lua调用它执行加法,其事件是"add",元方法是执行加法的函数。
2、元表的设置和获取
可通过函数getmetatable查询任何值的元表。
可通过函数setmetatable替换表的元表。
1)元表设置元方法
例子1:
表加法的元方法的代码例子如下:
function add(t1,t2)
--"#"运算符取表长度
assert(#t1 == #t2)
local length = #t1
for i = 1,length do
t1[i] = t1[i] + t2[i]
end
return t1
end
--setmetatable 设置表的元方法__add,支持表之间的加法,返回被设置的表
t1 = setmetatable({1,2,3},{__add = add})
t2 = setmetatable({10,20,30},{__add = add})
t1 = t1 + t2 -- 表之间相加,返回相加后的表
for i = 1 ,#t1 do
print(t1[i])
end
输出结果:
11
22
33
例子2:
t = {}
print(getmetatable(t)) --显示过元表 此时是nil
--可以用setmetatable来设置或修改任何table的元表
t1 = {}
setmetatable(t,t1)
assert(getmetatable(t) == t1)
2)有元表的类型
任何table可以作为任何值的元表,而一组相关的table可以共

本文详细介绍了Lua中的元表概念,包括元表的定义、设置与获取,重点讲解了元表的元方法,如元方法的设置、数学运算、顺序比较、连接、取长和索引操作的控制。此外,还提到了元表如何实现表的默认值、代理以及读写权限的控制。
最低0.47元/天 解锁文章
778

被折叠的 条评论
为什么被折叠?



