lua元表(Metatable)

2018-11-02  本文已影响0人  Mad_Elliot

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

mytab = {}                          -- 普通表 
mymetatab = {}                      -- 元表
setmetatable(mytab,mymetatab)     -- 把 mymetatab 设为 mytab 的元表 
mytable = setmetatable({},{})  --相当于上面操作
getmetatable(mytab)                 -- 这回返回mymetatable
__index : 访问表中不存在的下标时调用
  1. __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
  1. __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

其他参数

上一篇下一篇

猜你喜欢

热点阅读