Compare two case class values by their fields.

value-equality Case classes compare by field values, not by object identity. Two instances with the same fields are equal, which makes them safe to compare directly.

Value Equality

red
ValueEquality.scala
Replay: real traced execution (multi-file project)
case class Color(r: Int, g: Int, b: Int)

object Main {
  def main(args: Array[String]): Unit = {
    val red = 255
    val a = Color(red, 0, 0)
    val b = Color(255, 0, 0)
    val same = a == b

    println("a=" + a.toString)
    println("b=" + b.toString)
    println("same=" + same)
  }
}
case class Color(r: Int, g: Int, b: Int)

object Main {
  def main(args: Array[String]): Unit = {
    val red = 0
    val a = Color(red, 0, 0)
    val b = Color(255, 0, 0)
    val same = a == b

    println("a=" + a.toString)
    println("b=" + b.toString)
    println("same=" + same)
  }
}
case class Color(r: Int, g: Int, b: Int)

object Main {
  def main(args: Array[String]): Unit = {
    val red = 200
    val a = Color(red, 0, 0)
    val b = Color(255, 0, 0)
    val same = a == b

    println("a=" + a.toString)
    println("b=" + b.toString)
    println("same=" + same)
  }
}
  1. red ← 255, a ← Color(255,0,0), b ← Color(255,0,0), same ← true

    3object Main {4  def main(args: Array[String]): Unit = {5    val red→ 255 = 255 //@red=200, 06    val a→ Color(255,0,0) = Color(red255, 0, 0)7    val b→ Color(255,0,0) = Color(255, 0, 0)8    val same→ true = aColor(255,0,0) == bColor(255,0,0)910    println("a=" + a.toStringColor(255,0,0))11    println("b=" + b.toStringColor(255,0,0))12    println("same=" + sametrue)13  }14}
    outputa=Color(255,0,0)
    b=Color(255,0,0)
    same=true
  1. red ← 0, a ← Color(0,0,0), b ← Color(255,0,0), same ← false

    3object Main {4  def main(args: Array[String]): Unit = {5    val red→ 0 = 06    val a→ Color(0,0,0) = Color(red0, 0, 0)7    val b→ Color(255,0,0) = Color(255, 0, 0)8    val same→ false = aColor(0,0,0) == bColor(255,0,0)910    println("a=" + a.toStringColor(0,0,0))11    println("b=" + b.toStringColor(255,0,0))12    println("same=" + samefalse)13  }14}
    outputa=Color(0,0,0)
    b=Color(255,0,0)
    same=false
  1. red ← 200, a ← Color(200,0,0), b ← Color(255,0,0), same ← false

    3object Main {4  def main(args: Array[String]): Unit = {5    val red→ 200 = 2006    val a→ Color(200,0,0) = Color(red200, 0, 0)7    val b→ Color(255,0,0) = Color(255, 0, 0)8    val same→ false = aColor(200,0,0) == bColor(255,0,0)910    println("a=" + a.toStringColor(200,0,0))11    println("b=" + b.toStringColor(255,0,0))12    println("same=" + samefalse)13  }14}
    outputa=Color(200,0,0)
    b=Color(255,0,0)
    same=false