case类中的var成员是否会影响case类的相等性?

mon*_*ica 7 scala equality algebraic-data-types case-class

我在代码中大量使用了case类,回复了case类的底层相等定义,以便正确运行.然后我发现我需要将另一个字段成员添加到案例类.

  1. 因此,如果我var在case类中添加一个字段成员,它会弄乱case类的相等属性吗?
  2. 如果1是肯定的,那么如果我只更改var一次字段值,那么在案例类进入任何集合或进行相等比较之前,不会发生任何重新分配,那么这仍然会破坏相等行为吗?

Ran*_*ulz 12

Case类的相等性完全基于它的主要构造函数属性,无论它们是var或者val(是的,您可以var通过明确var地覆盖valcase类构造器args所拥有的隐含来创建它们.)在body的主体中添加属性case class 不会影响编译器生成的equals(other: Any)方法.

见证人:

package rrs.scribble

object  CCVarEq
{
  case class CC1(i: Int, j: Float, var k: Double)

  case class CC2(i: Int, j: Float, var k: Double) {
    var l = math.Pi
  }

  def show {
    val cc11 = CC1(1, 2.0f, 3.0)
    val cc12 = CC1(1, 2.0f, 3.0)

    val cc21 = CC2(1, 2.0f, 3.0); cc21.l = math.E
    val cc22 = CC2(1, 2.0f, 3.0)

    printf("cc11 == cc12: %s%n", cc11 == cc12); cc12.k = math.Pi * math.E
    printf("cc11 == cc12: %s%n", cc11 == cc12)

    printf("cc21 == cc22: %s%n", cc21 == cc22)
  }
}
Run Code Online (Sandbox Code Playgroud)

在REPL中:

scala> import rrs.scribble.CCVarEq._
import rrs.scribble.CCVarEq._

scala> show
cc11 == cc12: true
cc11 == cc12: false
cc21 == cc22: true
Run Code Online (Sandbox Code Playgroud)

所有关于并发的杰西的观点也是有效的.