美文网首页
lua元表(Metatable)

lua元表(Metatable)

作者: Mad_Elliot | 来源:发表于2018-11-02 12:27 被阅读0次

    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
    

    其他参数

    相关文章

      网友评论

          本文标题:lua元表(Metatable)

          本文链接:https://www.haomeiwen.com/subject/fyuqxqtx.html