为什么符合 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
我通过使 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