如何让 Sequence 实现 Equatable?

How can I get Sequence to implement Equatable?

我有以下最佳尝试:

extension Equatable where Self: Sequence, Self.Element: Equatable {
    public static func == (lhs: Self, rhs: Self) -> Bool {
        return lhs.elementsEqual(rhs)
    }
}

但是好像不行。此外,它要求两个序列具有完全相同的类型,而我只想限制它们的 Element 类型相同。有什么办法吗?

协议从不符合其他协议。协议可以要求其他协议(我们通常称之为"protocol inheritance"),但这并不会使协议符合其他协议。协议甚至不符合 自身 ,更不用说其他东西了。 Sequence.self 无法传递给需要 Sequence.Type.

的事物

无论如何,Equatable 要求被比较的事物是同一类型。 "equal" 的其他含义不等式。

如果您想在 "these two sequences have the equal elements," 之上构建方法,那很好。这就是 elementsEqual 已经为您做的。但这并不能使它们等同。

您要构建什么算法来使用这个 elementEqual 尚未处理的算法?

您正在寻找的可能只是一些语法糖,使其看起来像 ==。那完全没有问题。您可以构建任何要实现的运算符 elementsEqual.

infix operator ~=

func ~= <S1, S2>(lhs: S1, rhs: S2) -> Bool
    where S1: Sequence, S2:Sequence,
    S1.Element: Equatable, S1.Element == S2.Element
{
    return lhs.elementsEqual(rhs)
}

我通常不建议使用自定义运算符,但如果您正在做大量此类工作,显式 "these sequences have equal values in the same order" 运算符可能会非常有用。您只是不想使用 ==,因为这已经意味着这并不意味着什么。例如,两个Set可能是==,但不是~=,所以你需要选择你想要的工具。