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使用するという印象を受けました。==私は誤解しましたか?

バージョン: Scala-2-10-2

4

2 に答える 2

7

問題は、メソッドをオーバーライドせずにオーバーロードする==ことです。def == (a: Any): Booleanjava と scala では任意の 2 つのオブジェクトを比較できるため、として定義する必要があります。ただし、ケース クラスでは、このメソッドは final です。ただし、は単なるエイリアスであるequalsため、同じ署名でオーバーライドできます。ただし、ケース クラスでこれらのメソッドをオーバーライドすることは避けてください。==equals

于 2013-07-04T10:42:51.467 に答える
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

ケース クラスを使用するのは、間違いやすいものを自動化するためです。

等式が間違っているため、ケースクラスを使用すべきではないというあなたの結論は、一種の間違った結論です。

于 2013-07-05T01:30:46.377 に答える