Lua 运算符重载

我在网络上找到了一些关于 Lua 运算符可以重载的地方,但我似乎找不到任何示例。

有人可以提供一个例子,比如重载 + 运算符使其像 .. 运算符一样用于字符串连接吗?

编辑1:对 Alexander Gladysh 和 RBerteig:

如果只有在两个操作数是相同类型时才能重载运算符,并且更改此行为不容易,那么以下代码为什么有效?(我不是说任何冒犯话,我刚开始学习这种语言):

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

Set = {}
Set.mt = {}    -- 元表适用于集合

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)
    - 这部分管理不同类型的操作符重载
    - 如果用户使用:new_set = some_set + some_number 构建新集合
    如果类型(a)==“table”且类型(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用户使用:new_set = some_number + some_set构建新集合
    elseif type(b)==“table”且类型(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

    如果getmetatable(a)~= Set.mt或
    getmetatable(b)~= Set.mt then
        error(“尝试使用非集合值和不是数字的非集合值进行'添加'”,2end

    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.tostringsetlocal s = “{”
    local sep =“”
    for e in pairssetdo
        s = s .. sep .. e
        sep =“,”
    end
    return s ..“}”
end

function Set.printsprintSet.tostrings))
end

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

Set.mt.__add = Set.union

- 现在尝试通过合并集合和数字来创建新集合:
s3 = s1 + 8
Set.prints3--> {1,10,20,30,50}

原文链接 https://stackoverflow.com/questions/2810545

点赞
stackoverflow用户33252
stackoverflow用户33252

metatable 函数只能用于表,但是可以使用 debug.metatable 来设置字符串的元表:

> mt = {}
> debug.setmetatable("", mt)
> mt.__add = function (op1, op2) return op1 .. op2 end
> ="foo"+"bar"
foobar

另一个方法是使用 debug.getmetatable 来扩充内置字符串元表(回答下面评论的问题):

~ 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
2010-05-11 12:46:51
stackoverflow用户6236
stackoverflow用户6236

请参阅 Lua 编程手册中的 元表 章节以及《Lua 编程》第二版的元表和元方法章节。

请注意,对于比较运算符的运算符重载,仅当操作数类型相同时才起作用。

2010-05-11 15:48:22