gpt4 book ai didi

scala - Scala 2.9 中的案例类和代理行为

转载 作者:行者123 更新时间:2023-12-04 07:58:24 26 4
gpt4 key购买 nike

在将我们的代码迁移到 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 mailing list上讨论.

更新

我已经提交了 bug

最佳答案

在 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 方法来修复它。

关于scala - Scala 2.9 中的案例类和代理行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6667654/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com