零基础学lua第八天---table下

零基础学lua第八天—table下

一、前言

前面我们讲到了关于lua中的table的一些骚操作,今天我们要讲讲关于table中的魔法方法,也就是元表和元方法,听起来比较神秘,不过学起来一点都不难,至少比大多数人还要笨的小编我是这样想的。

二、元表

我们都知道,lua中的table是无法两两进行操作的,然而元表的出现使得这一约束被打破,他可以使得两个table中的值相加以及其它的操作。元表中有两个非常重要的函数,如下:

setmetatable(table,metatable): 对指定table设置元表(metatable),如果元表(metatable)中存在__metatable键值,setmetatable会失败 
getmetatable(table): 返回对象的元表(metatable)

我们先来看看没有使用元表时对两个table进行操作,如下:

在这里插入图片描述

可以看到,此时是无法将二者合二为一的,因为刚创建的table是没有元表的,因此需要我们给它设置,下面我们来使用元表函数试试,如下:

在这里插入图片描述

我们可以看到,设置了元表之后,就能获取到对象的元表的值了。

三、元方法

由于我们只是设置了元表,并没有对table进行操作,要想对table进行操作我们还需要给他们设置元方法,常见的元方法如下:

__add(a, b) --加法
__sub(a, b) --减法
__mul(a, b) --乘法
__div(a, b) --除法
__mod(a, b) --取模
__pow(a, b) --乘幂
__unm(a) --相反数
__concat(a, b) --连接
__len(a) --长度
__eq(a, b) --相等
__lt(a, b) --小于
__le(a, b) --小于等于
__index(a, b) --索引查询
__newindex(a, b, c) --索引更新
__call(a, ...) --执行方法调用
__tostring(a) --字符串输出
__metatable --保护元表

1.算术元方法

我们先来简单的使用下,先从算术元方法开始,如下:

在这里插入图片描述

我们可以看到,只有给元表指定了__add这个元方法后,才能返回这个元方法的值。

2.连接元方法

如果我们使用连接的元方法,如下:

在这里插入图片描述

就可以实现该table的元素组合为字符串的操作了。

3.元表保护

如果我们不想修改t1,t2的值,那么我们得给m设置一个保护属性,如下:

在这里插入图片描述

4.索引元方法

要想查看某个表中是否有某个元素,那么我们就需要使用索引元方法,如果存在的话就返回该索引对应的值,如果不存在的话就返回nil,如下:
在这里插入图片描述

如果我们访问的索引不存在的话,我们可以自己创建一个索引和值,如下:

在这里插入图片描述

我们可以看到,我们是将m作为了ff的元表,然后进行新增索引操作的,不过此时咱们的索引增加操作虽然没报错,但是也没成功。其实这是因为没有加入到ff中导致的,而且由于咱们刚刚传递的是一个函数,这个时候咱们换种方式,传一个table进去就可以了,如下:
在这里插入图片描述

此时我们可以看到我们是将f作为临时table来将里面的值传递给ff的,因此最后我们只能通过ff来访问新索引才能得到值。看到这里大家会不会觉得这个索引元方法有点绕,不好搞懂了;看不懂没关系,lua为我们准备了一个替代方案,相当简单,一个函数直接搞定,超级简单,如下:
在这里插入图片描述

如果你想判断两个table的某个键对应的值是否相同,lua也给我们提供了一个方法,如下:

local ff={name='bob',age=21,score=100}
print(rawequal(f.name,ff.name))

这样就可以对两个table中的name对应的值进行比较了。

5.调用元方法

当table被作为函数来被调用的时候,就会调用__call方法,如下:
在这里插入图片描述

6.输出

我们可以通过调用输出元方法来直接输出table中的键值对,如下:

在这里插入图片描述

四、总结

以上就是所有的元表和元方法的所有知识点,元表和元方法使得table更为灵活,很多时候我们都能用得上,当然一般只用在封装上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_30852573

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值