考虑以下代码:
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
。)
答案 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#的系统更好:首先,它不知道你的匿名类是可以比较的;第二,我真的不明白为什么顺序应该影响事物。在所有其他情况下,一个类的字段顺序无关紧要;为什么它在这里重要?)