8

私たちのコードを 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 のバグに過ぎないと思います。それ以外の場合、他のクラスを拡張するケース クラスがある場合は、その基本クラスの階層を調査して、プロキシを拡張していないことを確認する必要があります。コードでこれを行うことはできません。より明白なバグを修正するだけです。これが意図された動作である場合、コンパイラの警告は必須です。それは正しいと思いますか?

アップデート

また、 scala メーリング リストでも議論されています。

アップデート

バグを報告しました

4

3 に答える 3

6

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 は、何らかの理由で自分自身と等しくありません。

equals メソッドをオーバーライドして修正できます。

于 2011-07-12T16:54:53.027 に答える
1

これはあなたの問題を解決します

case class Test(a: String) extends Proxy {
   def self = a
   def canEqual(that: Any) = that match {
      case that: String => true
      case _ => false
   }
}
于 2011-07-12T16:59:15.847 に答える
0

では、equals メソッドを上書きしてみませんか? これで問題は解決するはずです。

于 2011-07-12T16:51:50.063 に答える