8
votes

Cours de cas et comportement proxy à Scala 2.9

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


4 commentaires

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é.


3 Réponses :


0
votes

Alors pourquoi ne pas écraser la méthode des égaux? Cela devrait résoudre le problème.


2 commentaires

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.



6
votes

in 2.9, ils ont changé la méthode des égaux de: xxx

à xxx

x: égale ne correspond pas à soi pour une raison quelconque .

Vous pouvez remplacer la méthode des égaux pour le réparer.


2 commentaires

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.



1
votes

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
   }
}


3 commentaires

Ou, plus simplement, que.isInstance de [string] .


Notez également que cela signifie que label == "bla" retournera vrai .


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.