Quel code est généré pour une méthode égale / hashCode d’une classe de cas?

J’ai du code Java que je traduis en Scala.

Le code consiste en quelques classes immuables qui correspondraient à l’objective d’une case class dans Scala.

Mais je ne veux pas introduire de bugs, donc je veux être sûr que le code généré pour equals et hashCode est / se comporte de manière équivalente à l’implémentation actuelle.

J’ai déjà regardé dans “Programmer en Scala” mais ça ne dit que

Troisièmement, le compilateur ajoute des implémentations «naturelles» des méthodes toSsortingng, hashCode et égal à votre classe.

Scala dispose d’une option de compilation -Xprint:typer , que vous pouvez utiliser pour obtenir le “code source post-typage qu’il utilise en interne”.

 scala -Xprint:typer -e 'case class Foo(a: Ssortingng, b: Int)' 

Ici, vous voyez quelque chose comme:

 override def hashCode(): Int = ScalaRunTime.this._hashCode(Foo.this); override def toSsortingng(): Ssortingng = ScalaRunTime.this._toSsortingng(Foo.this); override def equals(x$1: Any): Boolean = Foo.this.eq(x$1).||(x$1 match { case (a: Ssortingng,b: Int)this.Foo((a$1 @ _), (b$1 @ _)) if a$1.==(a).&&(b$1.==(b)) => x$1.asInstanceOf[this.Foo].canEqual(Foo.this) case _ => false }); 

Mais, cela ne vous dit pas comment hashCode est généré. Voici la source pour cela:

 def _hashCode(x: Product): Int = { var code = x.productPrefix.hashCode() val arr = x.productArity var i = 0 while (i < arr) { val elem = x.productElement(i) code = code * 41 + (if (elem == null) 0 else elem.hashCode()) i += 1 } code } 

Et, dans cet exemple, le premier cas de la correspondance de modèle égal serait simplement:

 case that: Foo => this.a == that.a && this.b == that.b