为什么符合 Strideable 会改变乘法的计算方式?

Why does conforming to Strideable change how multiplication is evaluated?

我通过使 Swift 结构符合 Strideable 协议,创建了一个无限循环。我将问题简化为以下情况。

struct T: Strideable {
    func advanced(by n: Int) -> T { return T() }
    func distance(to other: T) -> Int {
        print("Hello")
        return self == T() ? 0 : 1
    }
}

print(T() == T())

运行 playground 中的这段代码会导致无休止的 "Hello" 流。如果 struct T: Strideable 被替换为 struct T: Equatable,"true" 将如我所料打印出来。

我怀疑对于符合 Strideable 的类型有一个 Equatable 的默认实现,这与成员都是 equatable 的结构的自动合成实现不同。我项目中的结构有很多成员,所以我不想手动实现成员比较。

为什么遵循 Strideable 会改变实现相等性的方式,有没有一种方法可以在不手动实现 Equatable 的情况下恢复预期的行为?

来自苹果文档:

重要 Strideable 协议为等于 (==) 和小于 (<) 运算符提供默认实现,这取决于 Stride 类型的实现。如果一个符合Strideable的类型是自己的Stride类型,它必须提供这两个操作符的具体实现,以避免无限递归。

因此,您要么像这样提供“==”和“<”实现:

 struct Temp: Strideable {
var error = 1
func advanced(by n: Int) -> Temp { return Temp() }
func distance(to other: Temp)  -> Int {
    print("hello")
    return self == other ? 0 : 1
}
static func == (left : T, right: T){
    print("great")
}
}

或使用一些值来管理步幅 属性。喜欢 var location : Int = 0