lua中给表(table)重载运算符,使table之间可以互相加减乘除

1. 元表简介

lua中的每个值都有一个元表,table和userdata可以有各自的元表,而其他类型的值则共享类型中所属的单一元表,lua在创建新的table时不会创建元表。

例如:local t = {}

print(getmetatable(t))    --nil

但是我们可以使用setmetatable来设置或者修改任何table的元表:

local meta = {}

setmetatable(t, meta)

print(getmetatable(t))  --table


2. 元表示例

local mt = {} --定义一个元表
    
    local MyTable = {}
    function MyTable.new(value)
        local t = {}
        setmetatable(t, mt)
        for k,v in ipairs(value) do
            t[k] = v
        end
        return t
    end

    function MyTable.add(a, b)
        local t = {}
        for k,v in ipairs(a) do
            t[k] = a[k] + b[k]
        end
        return t
    end

    mt.__add = MyTable.add --除此之外还有__sub(减法), __mul(乘法), __div(除法), __unm(相反数), __mod(取余), __pow(乘幂)等算术方法
    mt.__sub = function(a, b) --也可以这么写
        local t = {}
        for k,v in ipairs(a) do
            t[k] = a[k] - b[k]
        end
        return t
    end

    local test1 = MyTable.new({1, 2})
    local test2 = MyTable.new({3, 4})
    local testAdd = test1 + test2
    local testSub = test1 - test2

这样我们就重新定义了table的元表,使MyTable创建的table可以直接相加或者减去。

你可能感兴趣的:(lua)