直接在内部案例中引用值或方法-class

Referencing values or methods in inner case-class directly

我想让组合案例 class 的 API 更简洁一些。因此,考虑 classic 示例的修改版本:

case class Address(street: String, city: String, zip: String) {
    some large collection of methods
}
case class Person(name: String, address: Address) {
    val street = address.street
    val city = address.city
    val zip = address.zip
}

现在,我喜欢这个,因为你可以直接从像 person.city 这样的人那里获得地址信息,而不是要求 person.address.city

但是,如果我们想象Address case class 上有大量的值或方法,Person val x = address.x class 会很乏味].有没有什么方法可以直接从一个人那里访问地址中的字段、值和方法,而无需手动映射它们?

一种选择是使用隐式转换。但我不会证明这种方法有多干净:

case class Address(street: String)
case class Person(name: String, address: Address) {
  private val s = this.street
}
implicit def person2address(p: Person): Address = p.address

Person("alex", Address("street")).street

也可以使用self types:

case class Person(name: String, address: Address) {
  _: Address =>
  private val s = street
}