Классы дел и поведение Proxy в Scala 2.9 - PullRequest
8 голосов
/ 12 июля 2011

При переносе нашего кода в Scala 2.9 мы обнаружили его большие массивы, которые не работали и молча давали сбой. Мы отследили это до случаев, когда классы Proxy не равны. В нашем коде мы не расширяем Proxy напрямую, мы просто расширяем классы в библиотеках, которые расширяют Proxy.

Любая помощь будет принята с благодарностью.

В 2.8

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 TRUE
true

scala> println(label == "bla")
true

В 2,9

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

Обновление

Я думаю, что это может быть только ошибкой в ​​Scala 2.9. В противном случае, если у вас есть класс case, который расширяет любой другой класс, вы должны исследовать иерархию этого базового класса, чтобы убедиться, что он никогда не расширяет Proxy. Мы не сможем сделать это в нашем коде, мы просто сможем исправить более очевидные ошибки. Если это предполагаемое поведение, тогда предупреждение компилятора обязательно. Это звучит примерно так?

Обновление

Также обсуждается в списке рассылки scala .

Обновление

Я подал ошибку

Ответы [ 3 ]

6 голосов
/ 12 июля 2011

В 2.9 они изменили метод equals с:

override def equals(that: Any): Boolean = 
  if(that == null) false 
  else that equals self

до

override def equals(that: Any): Boolean = that match {
 case null       => false
 case x: Equals  => (x canEqual self) && (x equals self)
 case x          => (x equals self)
}

x: Равный не равен себе по некоторым причинам.

Вы можете переопределить метод equals, чтобы исправить это.

1 голос
/ 12 июля 2011

Это решит вашу проблему

case class Test(a: String) extends Proxy {
   def self = a
   def canEqual(that: Any) = that match {
      case that: String => true
      case _ => false
   }
}
0 голосов
/ 12 июля 2011

Так почему бы вам не переписать метод equals? Это должно решить проблему.

...