本文共 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/