Есть ли способ гарантировать, что методы копирования классов дел существуют с классами типов в Scala? - PullRequest
0 голосов
/ 07 сентября 2018

В приведенном ниже примере у меня есть класс типа Foo, и я хотел бы как-то гарантировать, что у всех членов, соответствующих Foo (например, Bar до barFoo), есть метод копирования, такой как сгенерированный в порядке того, чтобы быть case class. Я не думал о способе сделать это. В этом случае копия подписи может быть что-то вроде copy(foo: F, aa: List[T] = foo.aa, maybe: Option[T] = foo.maybe): F.

trait Foo[F] {
  type T
  def aa(foo: F): List[T]
  def maybe(foo: F): Option[T]
}

final case class Bar(aa: List[String], maybe: Option[String])
object Bar {
  implicit val barFoo = new Foo[Bar] {
    type T = String
    def aa(foo: Bar): List[String] = foo.aa
    def maybe(foo: Bar): Option[T] = foo.maybe
  }
}

1 Ответ

0 голосов
/ 07 сентября 2018

Я не мог сделать это с типом member, но здесь вы версия с параметрами типа. Также необходимо добавить метод в Foo для создания объекта.

trait Foo[F, T] {
  def aa(foo: F): List[T]
  def maybe(foo: F): Option[T]
  def instance(aa: List[T], maybe: Option[T]): F
}

class Bar(val aa: List[String], val maybe: Option[String]) {
  override def toString = s"Bar($aa, $maybe)"
}

object Bar {
  implicit val barFoo = new Foo[Bar, String] {
    def aa(foo: Bar): List[String] = foo.aa
    def maybe(foo: Bar): Option[String] = foo.maybe
    def instance(aa: List[String], maybe:Option[String]):Bar = new Bar(aa, maybe)
  }
}

implicit class FooOps[A, T](fooable:A)(implicit foo:Foo[A, T]) {

  def copy(aa: List[T] = foo.aa(fooable), maybe: Option[T] = foo.maybe(fooable)) = {
    foo.instance(aa, maybe)
  }

}

val r = new Bar(List(""), Option("")).copy(aa = List("asd"))

println(r)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...