代码之家  ›  专栏  ›  技术社区  ›  Metropolis

直接引用内部case类中的值或方法

  •  0
  • Metropolis  · 技术社区  · 6 年前

    我想让组合用例类的API更干净一点。因此,考虑经典示例的修改版本:

    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 案例课,如果 val x = address.x 在个人课上。是否有某种方法可以直接从一个人身上访问地址中的字段、值和方法,而不需要手工映射它们?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Serhii Shynkarenko    6 年前

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

    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
    }