Mam zdefiniowaną poniżej klasę przypadku Foo
. Chcę zastąpić zachowanie ==
w tym, aby ostatni element (optBar
) został zignorowany w porównaniu. Oto, co próbowałem i wydaje się działać.Jak zdefiniować niestandardową równość w klasach przypadków
case class Bar(i:Int)
case class Foo(i:Int, s:String, optBar:Option[Bar]) {
override def equals(o:Any) = o match {
case Foo(`i`, `s`, _) => true
case _ => false
}
override def hashCode = i.hashCode*997^s.hashCode * 991
}
val b = Bar(1)
val f1 = Foo(1, "hi", Some(b))
val f2 = Foo(1, "hi", None)
f1 == f2 // true
Co chcę wiedzieć, czy metoda tworzenia hashCode
jest poprawna. Mam go od this link.
Zgadzam się z częścią "prowadzącą do dezorientujących zachowań", więc zastanawiam się, czy naprawdę mogę się bez niej obejść. Mogę, ale muszę dodać dodatkową logikę, aby zająć się ostatnim polem w 'Foo'. Muszę zważyć opcje. – Jus12
@ Jus12 Możesz napisać 'case class Foo (i: Int, s: String) (optBar: Option [Bar])'. Druga lista parametrów nie jest uważana za część generowanych metod klasy przypadków. – sschaef
Zaakceptowana jako poprawna odpowiedź, ponieważ 'override def hashCode = (i, s). ##' jest znacznie ładniejsze. Czy możesz rozwinąć to, co robi? :) – Jus12