sur la migration de notre code à Scala 2.9, nous avons trouvé de gros tours de celui qui n'a pas fonctionné et n'a pas échoué silencieusement. Nous l'avons suivi dans les classes de cas qui prolongent le proxy n'étaient pas égales. Dans notre code, nous n'allons pas directement à proxy, nous allons simplement étendre des cours dans des bibliothèques qui prolongent le proxy.
Toute aide serait grandement appréciée. P>
in 2.8 P>
scala> case class Test(a:String) extends Proxy { | def self = a | } defined class Test scala> scala> val label = new Test("bla") label: Test = bla scala> println(label == label) // this is now FALSE false scala> println(label == "bla") true
3 Réponses :
Alors pourquoi ne pas écraser la méthode des égaux? Cela devrait résoudre le problème. P>
En utilisant une classe de cas, vous devriez obtenir une méthode égale qui fonctionne. En utilisant une classe de cas et remplacer la méthode des égaux semble un peu fou, je ne pouvais tout simplement pas utiliser une classe de cas, ce qui fonctionnerait. C'est juste notre code en est plein.
Bien sûr que ce n'est pas idéal, mais je ne vois pas d'une autre manière.
in 2.9, ils ont changé la méthode des égaux de: à p> x: égale ne correspond pas à soi pour une raison quelconque . P> Vous pouvez remplacer la méthode des égaux pour le réparer. P> P>
Je pense que la solution la plus facile est juste de changer la classe de cas à une classe pour nous. Cependant, cela semble brisé ou au moins un changement de comportement qui aurait dû être documenté. Merci
Je pense que c'est probablement un bug, mais cette réponse explique où l'inventaire de l'insecte, alors je l'accepterai. Merci Joe.
Cela résoudra votre problème
case class Test(a: String) extends Proxy { def self = a def canEqual(that: Any) = that match { case that: String => true case _ => false } }
Ou, plus simplement, que.isInstance de [string] code>.
Notez également que cela signifie que label == "bla" code> retournera
vrai code>.
Il est retourné en 2,8 selon les résultats de la question. Je pense que l'intention était de reproduire le comportement de 2.8.
Avez-vous fini par avoir signalé cela comme un bug? (Si oui, lien?) La documentation pour le proxy vous avertit que cela peut conduire à des égaux non symétriques, mais cela ne prévoit pas que vous ne pouvez même pas être réfléchi ...!
Seth, je suis d'accord, cela ne peut vraiment être qu'un bug. J'ai mis à jour avec un lien ci-dessus.
Le bogue a été signalé fixé sur 10 / septembre / 11, FYI.
Ouais mais j'attends que cela soit assigné à une version de Scala avant de célébrer. Il a été réparé un moment, mais n'a aucun signe d'être libéré.