Lua 提供的元表(Metatable),允许我们改变table的行为,每个行为关联了对应的元方法。
mytab = {} -- 普通表
mymetatab = {} -- 元表
setmetatable(mytab,mymetatab) -- 把 mymetatab 设为 mytab 的元表
mytable = setmetatable({},{}) --相当于上面操作
getmetatable(mytab) -- 这回返回mymetatable
__index : 访问表中不存在的下标时调用
- __index 是一个函数时
t1 = {'apple', 'banana', 'candy'}
t = {} --元表
t.__index = function(t, index)--这里的t就是t1,index是传进来的下标
if index >3 then --当索引大于3,返回固定值
return "Egg"
end
end
setmetatable(t1, t)
print(t1[4])
>> Egg
- __index 是一个表时
my_tab = setmetatable({'one', 'two', 'three'},
{ __index = {key1 = "app", key2 = "ban"}})
print(my_tab[2])
print(my_tab.key1)
>> two
>> app
__add:两个表进行相加时调用
--两个表进行相加操作时进行合并
tab1 = {1,2,3}
tab2 = {5,6,7}
mtab = {}
mtab.__add = function(t1, t2)
for k,v in pairs(t2) do
table.insert(t1, v)
end
return t1
end
setmetatable(tab1, mtab) --这里设置元表设置tab1 tab2都可以
tab_sum = tab1 + tab2
for i,v in ipairs(tab_sum) do
print(v)
end
1
2
3
5
6
7
__sub:两个表进行相减时调用
--相减操作减去相同元素
tab1 = {1,2,3,4,5,6}
tab2 = {1,3,5,7}
mtab = {}
mtab.__sub = function(t1, t2)
for k,v in pairs(t1) do
for k2,v2 in pairs(t2) do
if(v == v2) then
table.remove(t1, k)
break
end
end
end
return t1
end
setmetatable(tab1, mtab)
tab_sub = tab1 - tab2
for k,v in pairs(tab_sub) do
print(v)
end
2
4
6
网友评论