作者:dajiang | 来源:互联网 | 2023-09-09 17:17
元表和元方法:对于表,我们可以使用元表和对应的元方法来定义表之间的操作,如算术操作、关系操作等等。Lua在创建表时,默认不带元表,可以使用函数setmetatable 来设置或修改任意表的元表,使用函数getmetatable来查看表:
t1 = {}
setmetatable(t, t1)
print( getmetatable(t) == t1)–> true
1、表的算数运算:Lua已经为我们规定好了各种算术操作符的元方法名称,
__add
加法
__sub
减法
__mul
乘法
__div
除法
__idiv
floor除法
__unm
负数
__mod
取模
__pow
幂运算
_-band
按位与
__bor
按位或
__bxor
按位异或
s1=Set.new{10,30,40,50} s2= Set.new {10,30,20,40,50} –先定义两个表
setmetatable(s1,mt)
setmetatable(s2,mt) –为两个表创建相同的元表。
mt.__add=Set.union –定义元方法,一般格式为mt.__add=function()
s3=s1+s2 –s1和s2相加,调用相加的元方法,即调用函数Set.union求两表的并集
print(Set.tostring(s3)) –>{10,20,30,40,50}
当然,我们可以修改用于创建集合的函数Set.new,让所有表示集合的表共享一个元表,即将mt设置为函数Set.new所创建的表的元表:
function Set.new (l)–第二个版本
local set = {f}
setmetatable(set,mt)
for _, v in ipairs(l) do
set[v] = true
end
return set
end
在此之后,所有由Set.new创建的集合都具有了一个相同的元表。
2、表的关系运算
元表关于关系运算的元方法有:
__eq
等于
__lt
小于
__le
小于等于
其他三个关系运算符没有单独的元方法,Lua语言会将a~=b 转换为not (a==b),a>b 转换为b=b 转换为b<=a。
3、库定义相关元方法
这里介绍两个库定义相关元方法,一个是“__tostring”,将表表示为字符串;还有一个是函数pairs,其也有对应的元方法,我们可以修改表被遍历的方式和为不是表的对象增加遍历的方式。