零基础学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更为灵活,很多时候我们都能用得上,当然一般只用在封装上。