У меня есть класс корпуса Foo
, определенный ниже. Я хочу переопределить поведение ==
тем, что последний элемент (optBar
) игнорируется при сравнении. Вот что я пробовал и, похоже, работает.Как определить пользовательское равенство в классах классов
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
Что я хочу знать, это правильный способ создания hashCode
. Я получил его от this link.
Я согласен с тем, что «приводит к запутанному поведению», поэтому я пересматриваю, если действительно может обойтись без него. Я могу, но мне нужно добавить дополнительную логику, чтобы позаботиться о последнем поле в 'Foo'. Мне нужно взвесить варианты. – Jus12
@ Jus12 Вы можете написать 'case class Foo (i: Int, s: String) (optBar: Option [Bar])'. Второй список параметров не считается частью генерируемых методов класса case. – sschaef
Принимается как правильный ответ, потому что 'override def hashCode = (i, s). ##' намного приятнее. Можете ли вы рассказать о том, что он делает? :) – Jus12