博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
13元表
阅读量:6676 次
发布时间:2019-06-25

本文共 2750 字,大约阅读时间需要 9 分钟。

01:定义

在 Lua table 中我们可以访问对应的key来得到value值,但是却无法对两个 table 进行操作。
因此 Lua 提供了元表(Metatable),允许我们改变table的行为,每个行为关联了对应的元方法。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

getmetatable(table): 返回对象的元表(metatable)。

mytable={"dd","巨大局"}  --普通表mymetatable={}   --元表table=setmetatable(mytable,mymetatable) --把mymetatable设置为mytable的元表 返回 mytableprint(table[1])getmetatable(mytable) --返回对象元表:

02:__index 元方法

__index方法则是“操作指南”的“索引失败时该怎么办
当你通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index 键

如果__index包含一个函数的话,Lua就会调用那个函数,table和键会作为参数传递给函数。

__index 元方法查看表中元素是否存在,如果不存在,返回结果为 nil;如果存在则由 __index 返回结果。

tableA={"1","2","3","4","5"}tableB={__index = function(mytable, key)       print("不存在")	   end	   }--设置元表返回对应的表tablec=setmetatable(tableA,tableB)print(tablec[1],tablec[9]) --不存在tabled=getmetatable(tableA) --获取元表

1.在表中查找,如果找到,返回该元素,找不到则继续

2.判断该表是否有元表(操作指南),如果没有元表,返回nil,有元表则继续

mytable={"dd","巨大局"}  --普通表mymetatable={__index=function(tab,key)print("调用了".. key)end}--元表table=setmetatable(mytable,mymetatable)print(table[3])--调用了3--nil
mytable={"dd","巨大局"}  --普通表newTable={}newTable[4]="44"newTable[5]="55"mymetatable={__index=newTable}--元表table=setmetatable(mytable,mymetatable)print(table[4])

1.在表中查找,如果找到,返回该元素,找不到则继续

2.判断该表是否有元表,如果没有元表,返回 nil,有元表则继续。
3.判断元表有没有 __index 方法,如果 __index 方法为 nil,则返回 nil;如果 __index 方法是一个表,则重复 1、2、3
如果 __index 方法是一个函数,则返回该函数的返回值。

03:__newindex 元方法

在这里插入图片描述
在这里插入图片描述
__newindex 元方法用来对表更新,__index则用来对表访问 。

当你给表的一个缺少的索引赋值,解释器就会查找__newindex 元方法:如果存在则调用这个函数而不进行赋值操作

mytable={"dd","巨大局"}mymetatable={__newindex=function(tab,k,v)print("设置新的值.."..k..":"..v)rawset(tab,k,v)end}table=setmetatable(mytable,mymetatable)table[4]="44"print(table[4])--设置新的值..4:44--44
mytable={"dd","巨大局"}newable={}mymetatable={__newindex=newable}table=setmetatable(mytable,mymetatable)table[4]="44"print(newable[4])--44

如果__newindex是一个table,则在给table不存在的字段赋值时,会直接给__newindex的table赋值。

在这里插入图片描述
如果__newindex是一个函数,则在给table不存在的字段赋值时,会调用这个函数。

在这里插入图片描述

04:

给表添加加法操作符

mytable={"11","22","33"}mymetatable={__add=function(table1,newtable)--最大索引local maxIndex=0for k,v in pairs(table1) doif maxIndex

05:call的作用

__call 元方法在 Lua 调用一个值时调用

mytable={}mymetatable={__call=function(tab,arg)print(arg)end}setmetatable(mytable,mymetatable)mytable(1)

06:__tostring 元方法

__tostring 元方法用于修改表的输出行为

mytable={"11","22","33"}mymetatable={__tostring=function(tab)local str=""for k,v in pairs(tab) dostr=str..v..","endreturn strend}setmetatable(mytable,mymetatable)print(mytable)--11,22,33,
tableA={name="躺下",age=100}tableB={address="192.180"}--设置元表--把tableB设置为tableA的元表 返回 mytabletable=setmetatable(tableA,tableB)tableB.__index=tableB --设置——indexprint(tableA["address"])print(table["address"])--获取元表t=getmetatable(tableA) --返回对象元表:print(t.address)

转载地址:http://snrxo.baihongyu.com/

你可能感兴趣的文章
CentOs~程序部署那些事
查看>>
关于查询扩展版ESI高被引论文的说明
查看>>
亚信安全与成都市政府达成战略合作
查看>>
SSH::Batch,在公有云中使用 ssh 工具箱
查看>>
“外围”消亡 企业安全防护需要新形态
查看>>
三招教你如何选择企业网盘
查看>>
轻量函数式 JavaScript:一、为什么要进行函数式编程?
查看>>
替代SSD?Crossbar进军中国存储市场
查看>>
红杉计越:AI、大数据、SaaS、云计算为何在中国一体迸发?
查看>>
阿里张勇:数据驱动的透明是平台治理的基础
查看>>
ActiveMQ - JMS,Transport,Persistence
查看>>
互联网大数据支撑生态银行建设
查看>>
视频会议系统迎来第四次浪潮
查看>>
报告显示:被调研中国企业超85%已从数字转型中获得回报
查看>>
东方日升拉美光伏电站项目 将进入首期施工
查看>>
软件探索性测试 笔记二
查看>>
将来也不会被破译的分布式存储系统
查看>>
光伏电站或成辅助服务市场“输家”
查看>>
今年光伏“领跑者”计划将升级扩围
查看>>
Java程序运行超时后退出或进行其他操作的实现
查看>>