如何让 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可能是==
,但不是~=
,所以你需要选择你想要的工具。
我有以下最佳尝试:
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可能是==
,但不是~=
,所以你需要选择你想要的工具。