十分钟学会Lua五:语言特性之元表与元方法

元表和元方法:对于表,我们可以使用元表和对应的元方法来定义表之间的操作,如算术操作、关系操作等等。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,其也有对应的元方法,我们可以修改表被遍历的方式和为不是表的对象增加遍历的方式。

上一篇:第九章伪代码编程过程 The PseudoCode Programming Process


下一篇:Redis+Lua解决高并发场景抢购秒杀问题