其他分享
首页 > 其他分享> > 零基础学lua第八天---table下

零基础学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