ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-05-17 19:54:29  阅读:160  来源: 互联网

标签:__ 元表 索引 -- --- lua table 方法


一、前言

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

二、元表

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

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

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

bb2abff32ddb0ee37be97171790ed483.jpeg


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

96b0cbc62dc3d039b2ed94b9435174e7.jpeg


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

三、元方法

由于我们只是设置了元表,并没有对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.算术元方法

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

37c1170fba5e23037974401430c2f063.jpeg


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

2.连接元方法

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

879a80dc235c6d984fe52488da2655e9.jpeg


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

3.元表保护

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

ee39e4c5d0b8a37cd67762e94160daec.jpeg


4.索引元方法

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

065280fed288e31de2bebe5024ba88f7.jpeg


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

25003e7a896d60000bb1ef63496feeb9.jpeg


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

70ce3582449ff909e73ad5820207bd8a.jpeg


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

00c1f13bc6ee5f74bda6fa2c8d10062f.jpeg


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

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

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

5.调用元方法

当table被作为函数来被调用的时候,就会调用__call方法,如下:

e936bdaed513b3f904aa5fb8771adf3e.jpeg


6.输出

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

e2cb81d720b29a58a4d9805528fc195e.jpeg


四、总结

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


标签:__,元表,索引,--,---,lua,table,方法
来源: https://blog.51cto.com/u_9736252/2781976

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有