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 @   ascertain  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2020-05-29 Linux系统登陆过程
2020-05-29 DNS & BIND
2020-05-29 利用openssl建立私有CA
2020-05-29 bash的[ ] [[ ]]
点击右上角即可分享
微信分享提示