Make a changed copy and leave the original intact.

update-by-copy Immutable data is never changed in place. `copy` builds a new value with one field replaced while the original keeps its old fields.

Update by Copy

dx
UpdateByCopy.scala
Replay: real traced execution (multi-file project)
case class Point(x: Int, y: Int)

object Main {
  def main(args: Array[String]): Unit = {
    val dx = 5
    val origin = Point(0, 0)
    val x = origin.x + dx
    val moved = origin.copy(x = x)

    println("origin=" + origin.toString)
    println("moved=" + moved.toString)
    println("originUnchanged=" + (origin.x == 0))
  }
}
case class Point(x: Int, y: Int)

object Main {
  def main(args: Array[String]): Unit = {
    val dx = 1
    val origin = Point(0, 0)
    val x = origin.x + dx
    val moved = origin.copy(x = x)

    println("origin=" + origin.toString)
    println("moved=" + moved.toString)
    println("originUnchanged=" + (origin.x == 0))
  }
}
case class Point(x: Int, y: Int)

object Main {
  def main(args: Array[String]): Unit = {
    val dx = 10
    val origin = Point(0, 0)
    val x = origin.x + dx
    val moved = origin.copy(x = x)

    println("origin=" + origin.toString)
    println("moved=" + moved.toString)
    println("originUnchanged=" + (origin.x == 0))
  }
}
  1. dx ← 5, origin ← Point(0,0), x ← 5, moved ← Point(5,0)

    3object Main {4  def main(args: Array[String]): Unit = {5    val dx→ 5 = 5 //@dx=1, 106    val origin→ Point(0,0) = Point(0, 0)7    val x→ 5 = originPoint(0,0).x + dx58    val moved→ Point(5,0) = originPoint(0,0).copy(x→ 5 = x)910    println("origin=" + origin.toStringPoint(0,0))11    println("moved=" + moved.toStringPoint(5,0))12    println("originUnchanged=" + (originPoint(0,0).x == 0))13  }14}
    outputorigin=Point(0,0)
    moved=Point(5,0)
    originUnchanged=true
  1. dx ← 1, origin ← Point(0,0), x ← 1, moved ← Point(1,0)

    3object Main {4  def main(args: Array[String]): Unit = {5    val dx→ 1 = 16    val origin→ Point(0,0) = Point(0, 0)7    val x→ 1 = originPoint(0,0).x + dx18    val moved→ Point(1,0) = originPoint(0,0).copy(x→ 1 = x)910    println("origin=" + origin.toStringPoint(0,0))11    println("moved=" + moved.toStringPoint(1,0))12    println("originUnchanged=" + (originPoint(0,0).x == 0))13  }14}
    outputorigin=Point(0,0)
    moved=Point(1,0)
    originUnchanged=true
  1. dx ← 10, origin ← Point(0,0), x ← 10, moved ← Point(10,0)

    3object Main {4  def main(args: Array[String]): Unit = {5    val dx→ 10 = 106    val origin→ Point(0,0) = Point(0, 0)7    val x→ 10 = originPoint(0,0).x + dx108    val moved→ Point(10,0) = originPoint(0,0).copy(x→ 10 = x)910    println("origin=" + origin.toStringPoint(0,0))11    println("moved=" + moved.toStringPoint(10,0))12    println("originUnchanged=" + (originPoint(0,0).x == 0))13  }14}
    outputorigin=Point(0,0)
    moved=Point(10,0)
    originUnchanged=true