Lua-元表
Lua-元表元表作用元表扩展普通表 举例:如果A+B两个表相加,如果不设置元表的话就会报错,这种情况就可以设置元表来实现,就类似C++的友元函数这种概念 元表设置mymetable = {}
mytable = setmetatable({},mymetable)
设置失败情况当元表有_metatable键值则设置失败 如果元表设置了这个键值,则getmetatable方法只会返回这个_metatable的值,这样会保护元表使得外界获取不到并且不能修改元表 元表__index元方法当通过键来访问table的时候,如果这个键不存在则lua会寻找该table的metatable中的__index键,如果__index包含一个table,则会在表格中查找对应的键 mytable = {"LUA","Java","C#"}
mymetatable = {
__index = function(tab,key)
print(tab)
print("调用了__index方法" .. key)
return "Javascript"
end
}
mytable = setmetatable(mytable,mymetatable)
print(mytable[10])
注释:key就是访问mytable的key 元方法__index还可以设置一个表格 mytable = {"LUA","C#"}
newtable = {7="javascript",8="PHP"}
mymetatable = {
__index = newtable
}
mytable = setmetatable(mytable,mymetatable)
print(mytable[7]) --返回javaScript 如果不存在的话则返回nil
元表__newindex元方法__newindex添加新的数据才会起作用,如果修改已经存在的key不会起作用,他也可以设置表或者数据 mytable = {"LUA",8="PHP"}
mymetatable = {
--当我们修改一个不存在的key的时候才会触发
__newindex = function(tab,key,value)
print("我们要修改的key为"..key.."把这个key值修改为:"..value)
rawset(tab,value)
end
}
mytable = setmetatable(mytable,mymetatable)
mytable[5] = "C#"
为表添加操作符mytable = {"LUA","C#"}
newtable = {"javascript","PHP"}
mymetatable = {
__add = function(tab,newtab)
local mi = 0
for k,v in pairs(ta) 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
还有其他操作符方法 元表__call元方法将表当做方法使用会触发__call方法 mytable = {"LUA","PHP"}
mymetatable = {
__call = function(tab,arg) --arg可以添加无数个参数
print(arg)
return "aladdin"
end
}
mytable = setmetatable(mytable,mymetatable)
v = mytable(34)
print(v)
元表中的__tostring的作用打印table时候调用 mytable = {"LUA","PHP"}
mymetatable = {
__tostring = function(mytable)
local str = ""
for k,v in pairs(mytable) do
str = str .. v ..","
end
end
}
mytable = setmetatable(mytable,mymetatable)
print(mytable)
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |