Dal codice sorgente scala/Equals.scala
(here):canEqual() nei scala.Equals tratto
package scala
trait Equals extends scala.Any {
def canEqual(that: scala.Any): scala.Boolean
def equals(that: scala.Any): scala.Boolean
}
Nella documentazione, che dice:
Un metodo che dovrebbe essere chiamato da ogni bene -progetto metodo uguale che è aperto per essere sovrascritto in una sottoclasse.
Ho scelto a caso una classe che si estende scala.Equals
e che è abbastanza semplice da capire. Ho scelto scala.Tuple2[+T1, +T2]
, che estende il tratto scala.Product[T1, T2]
, che a sua volta estende il tratto scala.Product
, che a sua volta estende il tratto scala.Equals
.
Purtroppo, sembra che causa scala.Tuple2
è una classe caso, le canEqual()
e equals()
metodi sono generati automaticamente e pertanto non può essere trovato nel codice sorgente scala/Tuple2.scala
(here).
Le mie domande sono:
- Quando è un buon momento per estendere il tratto
scala.Equals
? - Come deve essere implementato
canEqual()
? - Quali sono le migliori pratiche (o standard) per utilizzare
canEqual()
inequals()
?
Grazie in anticipo!
PS: In caso se è importante, sto usando Scala 2.11.7.
Grazie per la risposta! Penso che il trucco sia 'that.canEqual (this)' invece di 'this.canEqual (that)', che controlla "in modo opposto" per garantire la validità di 'equals()'. Sai se la versione case class generata segue lo stesso schema che hai mostrato qui? Grazie! –
@ SiuChingPong-AsukaKenji- Lo credo, ma non lo so per certo. – Shadowlands