Immutable Data Patterns
Update by Copy
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
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))
}
}
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
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
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