为什么Scala没有在匿名类型之间定义一个合理的等式?

本文关键字:一个 Scala 定义 之间 类型 为什么 | 更新日期: 2023-09-27 17:52:54

考虑以下代码:

val a = new { val x = 1; val y = 2 }
val b = new { val x = 1; val y = 2 }
a == b // false

如果匿名类定义了一些相等的值,如果字段/方法/值是相同的,那么它会返回true,这不是明智的吗?

我想这也可以减少Scala在某些用例中必须生成的类文件的数量。

(据我所知,c#使用相同的类匿名类型,如果他们有相同的值在相同的顺序,并返回true时,这些得到比较。)

为什么Scala没有在匿名类型之间定义一个合理的等式?

因为很难在所有情况下都做正确的事情。

一般来说,在OO语言中,相等只在同一类的实例之间有意义。当你像问题中那样使用匿名类时,你实际上有两个看起来相同的不同类。

考虑(在伪代码中):

class Point {
    int x;
    int y;
}
class Dimensions {
    int x;
    int y;
}
class Rectangle {
    Point lowerLeftCorner;
    Dimensions dimensions;   
}

这里点不应该与维度相等,即使它们有相同的x和y值。但是具有相同x和y值的两个点比较起来应该相等。

在您的示例中,语言如何神奇地知道您是否希望两个不同的匿名类具有相同的含义?它们在概念上可以是两个点,或者一个点和一个维度。

(我不同意c#的系统更好:首先,它不知道你的匿名类是用来比较的;其次,我真的不明白为什么顺序会影响事情。在所有其他情况下,类的字段顺序无关紧要;)