如何在元组上定义后缀运算符?

Posted

技术标签:

【中文标题】如何在元组上定义后缀运算符?【英文标题】:How can I define a postfix operator on a tuple? 【发布时间】:2019-03-22 17:39:30 【问题描述】:

我有以下代码:

postfix operator ^^^
public postfix func ^^^(lhs: Int) -> Int 
    return 0


public postfix func ^^^<T>(lhs: (T, T)) -> [T] 
    return [lhs.0, lhs.1]


func go() 
    1^^^ // this works
    (0, 0)^^^ // error: Unary operator '^^^' cannot be applied to an operand of type '(Int, Int)'

我得到了错误,Unary operator '^^^' cannot be applied to an operand of type '(Int, Int)'。任何想法如何解决这个问题?

【问题讨论】:

是的,我明白你的意思了!看起来后缀运算符不适用于元组。真的不是很令人惊讶。也许您可以在实际用例中改用结构。元组确实是一种不合标准的类型,并且有很多事情它们不做(例如,元组相等也一直是一个主要问题)。 从未想过在元组上定义运算符。虽然如果我在代码库中看到(0, 0)^^^,头部会滚动:p 元组作为序列有一些非常好的用途,例如:(x, y, width, height) = ("x", "y", "width", "height")^^^.map dict[$0] 将从StringInt 的字典中获取一个帧。 @Alexander 我刚刚使用了^^^ 使其非常清楚这不是存在冲突的现有运算符:P 运算符对元组很好的主要原因是你不能扩展它们,所以添加方法是不可能的。 并且 你可以对元组做中缀操作符。我猜只是不是后缀? 【参考方案1】:

这是一个已知错误,比较 Swift 论坛中的 Prefix and postfix operators not working for tuple types 和 SR-294 Strange errors for unary prefix operator with tuple arg.

已针对 Swift 5 修复,以下在 Xcode 10.2 beta 4 中编译和运行:

postfix operator ^^^

public postfix func ^^^<T>(lhs: (T, T)) -> [T] 
    return [lhs.0, lhs.1]


let x = (0, 0)^^^
print(x) // [0, 0]

【讨论】:

以上是关于如何在元组上定义后缀运算符?的主要内容,如果未能解决你的问题,请参考以下文章

在运算符中使用以匹配元组中的项目

python函数是否忽略传入的参数的数据类型?

Lua - 在元表中只调用一个运算符

元组数据结构支持 in 运算符吗

如何在元组列表中找到所有最小元素?

元组数据结构支持 in 运算符吗