Ссылка на значения или методы во внутреннем case-классе напрямую - PullRequest
0 голосов
/ 17 декабря 2018

Я бы хотел сделать 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 в классе Person.Есть ли какой-либо способ прямого доступа к полю, значениям и методам в адресе от человека без сопоставления их всех вручную?

1 Ответ

0 голосов
/ 17 декабря 2018

Один из вариантов - использовать неявное преобразование.но я бы не стал объяснять, насколько чист этот подход:

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

также можно использовать типы :

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