z kodu źródłowego scala/Equals.scala
(here):canEqual() w scala.Equals trait
package scala
trait Equals extends scala.Any {
def canEqual(that: scala.Any): scala.Boolean
def equals(that: scala.Any): scala.Boolean
}
w dokumentacji jest napisane:
Metoda, która powinna być wywołana z każdego dołka -designed to metoda, która jest otwarta do nadpisania w podklasie.
Wybrałem losowo klasę, która rozszerza się o scala.Equals
i która jest dość prosta do zrozumienia. Wybrałem scala.Tuple2[+T1, +T2]
, która rozszerza cechę scala.Product[T1, T2]
, która z kolei rozszerza cechę scala.Product
, która z kolei rozszerza cechę scala.Equals
.
Niestety, wydaje się, że z powodu scala.Tuple2
jest klasą przypadek, metody canEqual()
i equals()
są generowane automatycznie, a zatem nie można było znaleźć w kodzie źródłowym scala/Tuple2.scala
(here).
Moje pytania są następujące:
- Kiedy jest dobry moment, aby przedłużyć cechę
scala.Equals
? - W jaki sposób należy wdrożyć ?
- Jakie są najlepsze praktyki (lub wzorce) do korzystania z
canEqual()
wequals()
?
Z góry dziękuję!
PS: Jeśli to ma znaczenie, używam Scala 2.11.7.
Dzięki za odpowiedź! Myślę, że trik polega na 'that.canEqual (this)' zamiast 'this.canEqual (that)', który sprawdza "w przeciwny sposób", aby zapewnić poprawność 'equals()'. Czy wiesz, czy wygenerowana wersja klasy spraw ma taki sam wzór, jak tutaj pokazano? Dzięki! –
@ SiuChingPong-AsukaKenji- Wierzę, że tak, ale nie wiem na pewno. – Shadowlands