Lua的自我学习之路-语法学习9

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/asdfghj253/article/details/80495396

要点:元表

元表(Metatable),允许我们改变table的行为,每个行为关联了对应的元方法

设置元表

mytable={"lua","c++","c#","xxx"} --普通表
mymetatable={}  --元表
setmetatable(mytable,mymetatable) --把 mymetatable 设为 mytable 的元表 
mytable = setmetatable({},{})--也可以这样设置


获取元表

getmetatable(mytable)                 -- 这回返回mymetatable


元表中的__metastable   --(注意是两个_)

__metatable是保护元表用的,只会返回__metatable的值,无法访问其他值

元表中的__index和__newindex的用法

__newindex 元方法用来对表更新,__index则用来对表访问

mytable={"lua","c++","c#","xxx"} --普通表
mymetatable={
        __index=function(tab,key)--固定两个参数table,和key(类似第n个的索引)
	   --方法可自定义
       print("当访问不存在的索引时会自动使用__index方法:"..key)
   end

   __index={1,2,3,4,5,6,7,8,9,"xxxx"}; --也可以输出表

   --当对表的数据进行 修改时(新的索引),会自动调用__newindex
   --__newindex={1,2,3,4,5,6,7,8,9,10,11} --用法跟__index类似

   __newindex=function(tab,key,value)
      print("修改了!!:"..key..":"..value)
   end

}  --元表
setmetatable(mytable,mymetatable)
print(mytable[1])
print(mytable[10]) --访问不存在,先__index,再nil
mytable[5]="xx"   --修改数据了,调用写的__newindex函数

元表中的__add元方法、__call元方法

此原方法__add在两表相加时调用、__call在 Lua 调用一个值时调用

mytable={"lua","java","dsfdas","dddddd"}
mymetatable=
{
  __add=function(tab,newtab)
    local m=0;
	for k,v in pairs(tab) do
	   if(k>m) then
         m=k;
	   end
	end
	for k,v in pairs(newtab) do
       m=m+1;
	   table.insert(tab,m,v);
	end
	return tab;
 end
 --__call 元方法在 Lua 调用一个值时调用
 __call=function()
	print("sdy");
 end
}
--元表

mytable=setmetatable(mytable,mymetatable)
newtab={"php","zzxxcc"}
ss=mytable+newtab;--两表相加的顺序无影响
ss2=newtab+mytable;
print(mytable)
print(ss);
for k,v in pairs(ss) do
   print(k,v);
end
print("中间线—————————————————————————————————");
for k,v in pairs(ss2) do
   print(k,v);
end
mytable=setmetatable(mytable,mymetatable) --__call的实际情况
newtab={"php","zzxxcc"}
print(mytable(newtab));  --输出"sdy"

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

mytable={"lua","java","dsfdas","dddddd"}
mymetatable=
{
tostring=function(mytable)
    local str=""
	for k,v in pairs(mytable) do
	    str=str..v.."。"
	end
	return str
 end
}
--元表
print(mytable);  --返回lua。java。dsfdas。dddddd。



猜你喜欢

转载自blog.csdn.net/asdfghj253/article/details/80495396