Scala集合包含不使用==?

时间:2013-07-04 10:22:59

标签: scala collections

请考虑以下代码:

scala> case class Foo(s:String, t:String, r:String) {
     |    def == (f:Foo) = s == f.s && t == f.t
     | }
defined class Foo

scala> val f1 = Foo("s", "t", "r")
f1: Foo = Foo(s,t,r)

scala> val f2 = Foo("s", "t", "r1")
f2: Foo = Foo(s,t,r1)

scala> f1 == f2
res24: Boolean = true

scala> Array(f1) contains (f2)
res25: Boolean = false

我认为contains使用上面定义的==。我误解了吗?

版本:Scala-2-10-2

2 个答案:

答案 0 :(得分:7)

问题是,您不能覆盖,但会重载==方法。它必须定义为def == (a: Any): Boolean,因为在java和scala中,您可以比较任何两个对象。但在案例类中,这种方法是最终的。但是,您可以使用相同的签名覆盖equals,因为==只是equals的别名。但是应该避免在case类中重写这些方法,因为case类的相等定义是,两个实例上的每个值都必须相等。

答案 1 :(得分:1)

要从案例魔法中排除r,只需定义Foo(s,t)(r)

scala> case class Foo(s: String, t: String)(r: String)
defined class Foo

scala> Array(Foo("a","b")("c")) contains Foo("a","b")("d")
res6: Boolean = true

您使用案例类是因为它们可以自动化容易出错的内容。

你的结论是你不应该使用案例类,因为你的错误是错误的,这是错误的结论。