Lua学习笔记之浅谈Lua的元表

目录

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


4、结语


        元表的作用很广泛,其中一点就是实现继承的方式用作模拟面向对象,本篇博客讲到这里,若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。

       QQ交流群:806091680(Chinar)

       该群为CSDN博主Chinar所创,推荐一下!我也在群里!

猜你喜欢

转载自blog.csdn.net/Mr_Sun88/article/details/105205942
今日推荐