Lua操作符重载

前端之家收集整理的这篇文章主要介绍了Lua操作符重载前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在网上找到一些地方说Lua的操作符是无法重载的,但似乎找不到任何的例子.

有人可以提供一个例子,例如,重载运算符的工作,像..操作符用于字符串连接?

编辑1:对亚历山大·格拉日和亚历山大:
如果操作符重载仅在两个操作数相同并且更改此行为时才起作用,那么以下代码如何工作? (我不是任何罪,我只是开始学习这种语言):

printf = function(fmt,...)
    io.write(string.format(fmt,...))
end

Set = {}
Set.mt = {}    -- Metatable for sets

function Set.new (t)
    local set = {}
    setMetatable(set,Set.mt)
    for _,l in ipairs(t) do set[l] = true end
    return set
end


function Set.union (a,b)
    -- THIS IS THE PART THAT MANAGES OPERATOR OVERLOADING WITH OPERANDS OF DIFFERENT TYPES
    -- if user built new set using: new_set = some_set + some_number
    if type(a) == "table" and type(b) == "number" then
        print("building set...")
        local mixedset = Set.new{}
        for k in pairs(a) do mixedset[k] = true end
        mixedset[b] = true
        return mixedset
    -- elseif user built new set using: new_set = some_number + some_set
    elseif type(b) == "table" and type(a) == "number" then
        print("building set...")
        local mixedset = Set.new{}
        for k in pairs(b) do mixedset[k] = true end
        mixedset[a] = true
        return mixedset
    end

    if getMetatable(a) ~= Set.mt or
        getMetatable(b) ~= Set.mt then
        error("attempt to 'add' a set with a non-set value that is also not a number",2)
    end

    local res = Set.new{}
    for k in pairs(a) do res[k] = true end
    for k in pairs(b) do res[k] = true end
    return res
end


function Set.tostring (set)
    local s = "{"
    local sep = ""
    for e in pairs(set) do
        s = s .. sep .. e
        sep = ","
    end
    return s .. "}"
end

function Set.print (s)
    print(Set.tostring(s))
end

s1 = Set.new{10,20,30,50}
s2 = Set.new{30,1}

Set.mt.__add = Set.union

-- now try to make a new set by unioning a set plus a number:
s3 = s1 + 8
Set.print(s3)  --> {1,10,50}

解决方法

Metatable函数仅适用于表,但可以使用debug.Metatable来设置字符串Metatable …
> mt = {}
> debug.setMetatable("",mt)
> mt.__add = function (op1,op2) return op1 .. op2 end
> ="foo"+"bar"
foobar
>

另一种方法是使用debug.getMetatable来增加内置字符串Metatable(回答下面的评论中的问题):

~ e$lua
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org,PUC-Rio
> debug.getMetatable("").__add = function (op1,op2) return op1 .. op2 end
> ="foo"+"bar"
foobar
>
原文链接:https://www.f2er.com/lua/274467.html

猜你在找的Lua相关文章