Immutable Data Patterns
Nested Immutable Data
Read fields from data nested inside data.
nested-immutable
Immutable values can hold other immutable values. Field access reads down through the nesting to a scalar without changing anything.
Nested Immutable Data
NestedImmutable.scala
Replay: real traced execution (multi-file project)
case class Address(city: String, zip: Int)
case class User(name: String, address: Address)
object Main {
def main(args: Array[String]): Unit = {
val zip = 10001
val addr = Address("NYC", zip)
val user = User("Ann", addr)
val city = user.address.city
val code = user.address.zip
println("name=" + user.name)
println("city=" + city)
println("zip=" + code)
}
}
case class Address(city: String, zip: Int)
case class User(name: String, address: Address)
object Main {
def main(args: Array[String]): Unit = {
val zip = 20002
val addr = Address("NYC", zip)
val user = User("Ann", addr)
val city = user.address.city
val code = user.address.zip
println("name=" + user.name)
println("city=" + city)
println("zip=" + code)
}
}
case class Address(city: String, zip: Int)
case class User(name: String, address: Address)
object Main {
def main(args: Array[String]): Unit = {
val zip = 30003
val addr = Address("NYC", zip)
val user = User("Ann", addr)
val city = user.address.city
val code = user.address.zip
println("name=" + user.name)
println("city=" + city)
println("zip=" + code)
}
}
zip ← 10001, addr ← Address(NYC,10001), user ← User(Ann,Address(NYC,10001))
4object Main {5 def main(args: Array[String]): Unit = {6 val zip→ 10001 = 10001 //@zip=20002, 300037 val addr→ Address(NYC,10001) = Address("NYC", zip10001)8 val user→ User(Ann,Address(NYC,10001)) = User("Ann", addrAddress(NYC,10001))9 val city→ NYC = user.addressAddress(NYC,10001).city10 val code→ 10001 = user.addressAddress(NYC,10001).zip1112 println("name=" + user.nameAnn)13 println("city=" + cityNYC)14 println("zip=" + code10001)15 }16}outputname=Ann city=NYC zip=10001
zip ← 20002, addr ← Address(NYC,20002), user ← User(Ann,Address(NYC,20002))
4object Main {5 def main(args: Array[String]): Unit = {6 val zip→ 20002 = 200027 val addr→ Address(NYC,20002) = Address("NYC", zip20002)8 val user→ User(Ann,Address(NYC,20002)) = User("Ann", addrAddress(NYC,20002))9 val city→ NYC = user.addressAddress(NYC,20002).city10 val code→ 20002 = user.addressAddress(NYC,20002).zip1112 println("name=" + user.nameAnn)13 println("city=" + cityNYC)14 println("zip=" + code20002)15 }16}outputname=Ann city=NYC zip=20002
zip ← 30003, addr ← Address(NYC,30003), user ← User(Ann,Address(NYC,30003))
4object Main {5 def main(args: Array[String]): Unit = {6 val zip→ 30003 = 300037 val addr→ Address(NYC,30003) = Address("NYC", zip30003)8 val user→ User(Ann,Address(NYC,30003)) = User("Ann", addrAddress(NYC,30003))9 val city→ NYC = user.addressAddress(NYC,30003).city10 val code→ 30003 = user.addressAddress(NYC,30003).zip1112 println("name=" + user.nameAnn)13 println("city=" + cityNYC)14 println("zip=" + code30003)15 }16}outputname=Ann city=NYC zip=30003