在lua中提供了很多键值
这些键值有很强大的功能
下面我就一一介绍一下
__index
这个是lua的元表中最常使用的键
当你通过键来访问table的时候,如果这个键没有值,那么lua就会自动寻找这个table的metatable中的__index键
如果index中包含一个表格,lua会在表格中查询相应的值
如果__index包含一个函数的话,lua就会调用哪个函数,table的键会作为参数传递给函数
__index元方法查看表中元素是否存在,如果不存在,返回结果为nil,如果存在则由__index返回结果
mytable={"zhang","li","hua"}
mymetatable={
__index=function (tab,key)
print(tab)
--print("调用了这个方法")--访问不存在索引 可以设置为做一件事情
if key>=10 then
return "zhangzishaui"--如果有返回值 就返回返回值
end
end
}
mytable=setmetatable(mytable,mymetatable)
print(mytable)--内存位置相同
print(mytable[7])
上边的元表中的__index添加一个方法
这个方法判断键值是否大于10 如果大于10则返回 zhangzishaui
否则只会输出“调用了这个方法”
mytable={"zhang","li","hua"}
newtable={}
newtable[6]="cao"
newtable[7]="qian"
newtable[8]="tahhua"
mymetatable={
__index=newtable
}
mytable=setmetatable(mytable,mymetatable)
print(mytable[7])
上边就是lua的__index的使用方法
__newindex
其实这个的使用方法和__index类似
但是这个是用于修改表中数据的时候使用
总结一下就是__newindex用来对表的更新,__index用来对表的访问
当你给表的一个缺少的索引赋值,解释器就会查找__newindex的元方法
如果存在这个 则调用这个函数不进行赋值操作
mytable={"zhang","li","hua"}
mymetatable={
__newindex=function (tab,key,value)
print("调用了这个方法")--访问不存在索引 可以设置为做一件事情
print(key.." "..value)
rawset(mytable,key,value)
end
}
mytable=setmetatable(mytable,mymetatable)
mytable[14]="df"
print(mytable[14])
上边我使用了一个rawset的函数 他是lua提供的
上边我通过函数 给索引为14的赋值 之后又输出索引为14的值
如果没有那句**rawset(mytable,key,value)**输出的就为nil(空)
给表添加加法操作符
首先给大家看一下这个对应表 之后我实现一下加法的效果
就是创建两个表 实现加法可以把两个表合并
mytable={"zhang","li","hua"}
newtable={"jin","wen","shua"}
mymetatable={
__add=function (tab,newtab)
local mi=0;
for k,b in pairs(tab) do
if k>mi
then mi=k;
end
end
for k,v in pairs(newtab) do
mi=mi+1
table.insert(tab,mi,v)
end
return tab
end
}
mytable=setmetatable(mytable,mymetatable)
v=mytable+newtable
for k,v in pairs(v) do
print(k,v)
end
运行结果
可以看到我们把两个表合并了
同理只要我们足够熟悉lua语句就可以很灵活的使用这些运算
__call
__call元方法在lua中调用一个值的时候调用
要是不加__call元方法的时候
直接使用**table(12)**是会产生报错的
mytable={"zhang","li","hua"}
newtable={"jin","wen","shua"}
mymetatable={
__call =function (tab,arg)
print(arg)
return "zhangzishaui"
end
}
mytable=setmetatable(mytable,mymetatable)
t=mytable(234)
print(t)
这样写了之后我们运行结果就是
这样写之后 我们也可以使用这个方法实现给一些值赋值的效果
__tostring
__tostring元方法适用于修改表的输出行为
mytable={"zhang","li","hua"}
newtable={"jin","wen","shua"}
mymetatable={
__tostring = function(mytable)
local str=""
for k,v in pairs(mytable) do
str=str..v..","
end
return str
end
}
mytable=setmetatable(mytable,mymetatable)
print(mytable)
运行结果
上边就是所有关于lua的元方法
希望我所写的对大家有帮助 如果有什么问题可以联系我
主页有我的联系方式