Lua: Metatable

 

运算符重载:

  

__add:

tbl = setmetatable({ 1, 2, 33 }, {
    __add = function(tbl, v)
        -- tbl 的长度不断变化, table.insert的pos参数不能使用#tbl+1, 越界会产生 position out of bounds
        if type(v) == 'table' then
            local length = #tbl
            for i = 1, #v do
                table.insert(tbl, length + i, v[i])
            end
        else
            table.insert(tbl, v)
        end
        return tbl
    end
})

jot = tbl + { 4, 55, 66 }
print(table.concat(jot, ', '))

vane = tbl + 5  -- vane & jot 指向同一地址空间
print(table.concat(vane, ', '))

__call:

tbl = setmetatable({ 5 }, {
    __call = function(tbl, v)
        local sum = 0
        for b = 1, #tbl do
            sum = sum + tbl[b]
        end
        if type(v) == 'table' then
            for b = 1, #v do
                sum = sum + v[b]
            end
        else
            sum = sum + v
        end
        return sum
    end
})

print(tbl({ 6, 7 }))
print(tbl(6))

 __tostring:

tbl = setmetatable({ 10, 20, 30 }, {
    __tostring = function(tbl)
        local str = ''
        for k, v in ipairs(tbl) do
            str = str .. string.format('[%d] = %s, ', k, v)
        end
        return string.gsub(str, ',%s*$', '')
    end
})

print(tbl)

 

 

 

 

 

 

posted @ 2022-05-29 23:26  ascertain  阅读(24)  评论(0编辑  收藏  举报