为什么Scala在匿名类型之间没有明确的平等?

时间:2011-04-24 09:03:32

标签: c# class scala equals anonymous-types

考虑以下代码:

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。)

1 个答案:

答案 0 :(得分:11)

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

通常,在OO语言中,相等性仅在同一个类的实例之间有意义。当您按照问题的方式使用匿名类时,实际上有两个不同的类看起来相同。

考虑(伪代码):

class Point {
    int x;
    int y;
}

class Dimensions {
    int x;
    int y;
}

class Rectangle {
    Point lowerLeftCorner;
    Dimensions dimensions;   
}

这里的Point永远不应该与Dimensions相等,即使它们具有相同的x和y值。但是具有相同x和y值的两个点应该相等。

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

(我不同意C#的系统更好:首先,它不知道你的匿名类是可以比较的;第二,我真的不明白为什么顺序应该影响事物。在所有其他情况下,一个类的字段顺序无关紧要;为什么它在这里重要?)