目录
1、博客介绍
2、内容
什么是元表:
元表的作用:
元表的设置和获取:
表和元表的查找关系:
元方法的用途:
3、推送
4、结语
1、博客介绍
本篇文章作为Lua的学习笔记,浅谈Lua元表的相关内容,主要内容包括,元表是什么,元表怎么用和一些元方法的用途,知识点有从菜鸟教程内摘抄,读者可以直接跳转菜鸟教程Lua元表的相关内容查看,博文底部设有传送门。
2、内容
什么是元表:
元表就是表,这个表有默认的元方法和自定义方法属性,并可以作为另外一个表的描述,这个表可以称为元表
元表的作用:
mytable = {}
mymetatable = {}
当你将表mymetatable设置为mytable表的元表之后,mytable就可以享有mymetatable所有的属性和方法,好比继承,当你调用mytable内的属性或者方法时,如果找不到,则会去其元表内再次查找,如果对表进行一些算数运算,则会触发元表内相关的一些默认元方法
元表的设置和获取:
mytable = {} -- 普通表
mymetatable = {} -- 元表
setmetatable(mytable,mymetatable) -- 把 mymetatable 设为 mytable 的元表
getmetatable(mytable) -- 这回返回mymetatable
mytable = setmetatable({},{})
我们可以通过setmetatable将一个表设置为另一个表的元表,该方法返回一个以mymetatable为元表的表,所以可以直接简写成mytable = setmetatable({},{})的形式,我们也可以通过getmetatable来获取一个表的元表,这个元表可以为nil。
表和元表的查找关系:
mytable = {}
mymetatable = {}
setmetatable(mytable,mymetatable)
mymetatable.__index = mymetatable
mymetatable.key2 = 100
print(mytable.key2)
--------------------------输出
100
元表有一些默认的元方法和一些属性,这些方法属性都是以两个下横杠开头(__),在这里讲一个元表最重要的默认属性__index,__index可以设置为任意数据类型,方法或者表都可以,这里我们要强调一点调用属性后的查找顺序,如上述代码所示,我们如果去调用mytable内的一个属性key2,我们会发现,mytable内并没有key2这个属性,然后会再去mytable的元表mymetatable内查找key2,这里其实并不是直接在mymetatable内去查找key2,而是在mymetatable的属性__index内去查找,所以上述中我将__index设置为了mymetatable本身,这样就可以找到mymetatable内的属性key2
查找顺序:
1、先在mytable内查找是否存在key2,若存在则返回
2、mytable内不存在key2则先寻找mytable是否存在元表,不存在则结束
3、mytable内存在元表mymetatable,在mymetatable内的__index内查找key2,如存在返回,不存在结束
元方法的用途:
local mytable1 = {1,2,3}
local mytable2 = {4,5,6}
print(mytable1 + mytable2)
如上述代码所示,正常情况下,我们是不能对两个表直接进行加减乘除的运算的,会报错,但是如果有元表存在,碰到运算符则会触发元表内的一些元方法,就比如+法会触发元表内的__add方法。
local mytable1 = {1,2,3}
local mytable2 = {4,5,6}
mymetatable = {}
setmetatable(mytable2,mymetatable)
function mymetatable:__add(table1,table2)
return 1
end
print(mytable1 + mytable2)
-------------------------输出
1
如上述代码所示,若是存在表和表的相加行为,则会按照相加的顺序来判断表是否具有元表,具有元表的话,元表内是否存在元方法__add,然后会调用第一个查找到的__add方法,__add方法存在返回值,若都不存在元表或元表内都不存在__add方法,则编译不通过,下方罗列了一些运算相关的元方法,还有一些非运算相关的元方法读者可以参考菜鸟教程。
__add | 对应的运算符 '+'. |
__sub | 对应的运算符 '-'. |
__mul | 对应的运算符 '*'. |
__div | 对应的运算符 '/'. |
__mod | 对应的运算符 '%'. |
__unm | 对应的运算符 '-'. |
__concat | 对应的运算符 '..'. |
__eq | 对应的运算符 '=='. |
__lt | 对应的运算符 '<'. |
__le | 对应的运算符 '<='. |
3、推送
Github:https://github.com/KingSun5
菜鸟教程Lua元表:https://www.runoob.com/lua/lua-metatables.html