2013-07-04 102 views
1

考慮下面的代碼:斯卡拉集合包含不使用==?

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使用==如上所定義。我誤解了嗎?

版本:斯卡拉-2-10-2

回答

7

的問題是,你不重寫,但超載==方法。它必須被定義爲def == (a: Any): Boolean,因爲在java和scala中你可以比較任何兩個對象。但是,如果這個方法是最終的。但是,您可以使用相同的簽名覆蓋equals,因爲==只是equals的別名。但是在應該避免使用類的情況下重寫這些方法,因爲case類的相等性的定義是,每個值都必須相等。

+0

所以可能更好的解決方案是不使用'case'類。 – Jus12

+0

我會這麼說。 – drexin

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 

您使用案例類,因爲它們會自動化容易出錯的東西。

你的結論是你不應該使用案例類,因爲你得到了平等的錯誤是一種錯誤的結論。