元表和元方法:对于表,我们可以使用元表和对应的元方法来定义表之间的操作,如算术操作、关系操作等等。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<a,a>=b 转换为b<=a。
3、库定义相关元方法
这里介绍两个库定义相关元方法,一个是“__tostring”,将表表示为字符串;还有一个是函数pairs,其也有对应的元方法,我们可以修改表被遍历的方式和为不是表的对象增加遍历的方式。