Я пытаюсь найти элегантный способ сделать следующее.
Предположим, у нас есть следующие классы:
case class Foo(fooName: String, bar: Bar, baz: Baz)
case class Bar(barName: String, baz: Baz)
case class Baz(bazName: String)
Я хочу иметь возможность изменить имя (вв этом случае Foo и его дочерние объекты каким-то образом), например, для добавления к ним префикса с некоторым заголовком.
Я мог бы определить класс типов, который служит этой цели:
trait Titled[T] {
def titled(t: T)(title: String): T
}
Для Fooреализация будет делать это:
implicit val fooTitled: Titled[Foo] = new Titled[Foo] {
def titled(foo: Foo)(title: String): Foo = foo.copy(fooName = title + fooName)
}
Могут быть другие реализации, такие как Esquired, которые суффиксят имя с «Esq».
Но это не обновляет заголовокзначения детей, bar и baz, которые мне бы хотелось.
В конечном итоге я хотел бы получить что-то вроде этого:
//import all the implicits needed
val foo = Foo(...)
val titledFoo = foo.title("Mr. ") // names are prefixed with Mr.
val andEsquired = foo.esquire // names are also suffixed with Esq
Теперь я искалонлайн, чтобы увидеть, возможно ли это сделать, и я видел бесформенную библиотеку, но я все еще не на том уровне знаний Scala, который я мог бы расшифровать и создать такую «магию», если это вообще возможно.
Я не обязательно ищу полное решение(хотя я был бы признателен за это), но если бы кто-то мог указать мне правильное направление, показать мне некоторые примеры, учебные пособия или что-то подобное, я был бы очень благодарен.