为什么在Swift中重载==在全局范围内完成?

为什么在Swift中重载==在全局范围内完成?,swift,Swift,我正在学习Swift,对于为什么在全局范围内进行重载,我有点困惑。此代码: class Foo: Equatable { var name = "Untitled" } func == (lhs: Foo, rhs: Foo) -> Bool { return lhs.name == rhs.name } let value1 = Foo() var value2 = Foo() let firstCheck = value1 == value2 在Ruby背景中,我们

我正在学习Swift,对于为什么在全局范围内进行重载,我有点困惑。此代码:

class Foo: Equatable {
    var name = "Untitled"
}
func == (lhs: Foo, rhs: Foo) -> Bool {
    return lhs.name == rhs.name
}

let value1 = Foo()
var value2 = Foo()
let firstCheck = value1 == value2
在Ruby背景中,我们对正在比较的对象声明了一个==方法,这让人感到非常奇怪:

class Foo
  def == (otherFoo)
   self.name == otherFoo.name
  end
end
如果在同一个文件中声明几个类,会发生什么?或者斯威夫特会研究lhs的类型。和rhs。查看在何处应用重载

我不确定原因,但所有运算符声明都是在全局范围内完成的。您是对的-Swift编译器查看类型或泛型约束,实际上,在大多数情况下,并使用它们来确定要调用哪个函数。这里有大量的==定义—您可以。

我不确定原因,但所有运算符声明都是在全局范围内完成的。您是对的-Swift编译器查看类型或泛型约束,实际上,在大多数情况下,并使用它们来确定要调用哪个函数。这里有大量的==定义-您可以。

这是因为所有运算符都在全局范围内,如果您想定义自己的运算符,您需要;另见。运算符是特殊的,因为它具有优先级和关联,而这是常规方法所没有的

现在,您可以让它们成为Ruby选择实现的对象的一部分,并在某处使用隐式规则。Swift设计者选择使自定义运算符成为可以重载的全局函数。我不知道它们的原因,但我想这会让编译器更容易、更一致毕竟,Ruby是在Swift编译时解释的,并且希望在编译时尽可能多地进行优化。

这是因为所有运算符都在全局范围内,如果您想定义自己的运算符,您需要;另见。运算符是特殊的,因为它具有优先级和关联,而这是常规方法所没有的


现在,您可以让它们成为Ruby选择实现的对象的一部分,并在某处使用隐式规则。Swift设计者选择使自定义运算符成为可以重载的全局函数。我不知道他们的原因,但我想这会让编译器的工作变得更简单、更一致,Ruby在编译Swift时进行解释,并希望在编译时尽可能多地进行优化。

Swift示例改编自我看来很清楚的是,运算符是在全局范围内定义的,因为并非所有运算符在逻辑上都属于一个操作数的类型,而不是另一个操作数的类型。在这些情况下,您可以在一个单独的文件中定义运算符,以强调所有权的缺乏。@Jessy您是说在lhs和RH是不同类型的情况下进行苹果对梨的比较,还是在重写可能不属于您的类型的运算符时进行比较?苹果对梨没有意义==,我不确定在Swift的两种不同的具体类型上是否会有一个好的==用例;用他们都采用的协议来定义==可能更有意义。属于模块/个人/代码库不相关;我所说的所有权是指类、结构和枚举拥有它们的成员。例如,当您为向量和矩阵定义乘法运算符时,该运算符不属于一种或另一种类型。我似乎很清楚,根据这一点改编的Swift示例在全局范围内定义了运算符,因为并非所有运算符在逻辑上都属于一个操作数的类型,而不是另一个操作数的类型。在这些情况下,您可以在一个单独的文件中定义运算符,以强调所有权的缺乏。@Jessy您是说在lhs和RH是不同类型的情况下进行苹果对梨的比较,还是在重写可能不属于您的类型的运算符时进行比较?苹果对梨没有意义==,我不确定在Swift的两种不同的具体类型上是否会有一个好的==用例;用他们都采用的协议来定义==可能更有意义。属于模块/个人/代码库不相关;我所说的所有权是指类、结构和枚举拥有它们的成员。例如,当您为向量和矩阵定义乘法运算符时,该运算符不属于任何一种类型。非常棒的工具,感谢您的回答,@DarkDust确实提供了更多的细节。非常棒的工具,感谢您的回答,@DarkDust确实提供了更多的细节。