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

zip
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)
  }
}
  1. 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
  1. 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
  1. 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