Я хотел бы знать, можно ли абстрагировать метод копирования классов case. В основном у меня есть что-то вроде sealed trait Op, а затем что-то вроде case class Push(value: Int) extends Op и case class Pop() extends Op.
Первая проблема: класс case без аргументов/членов не определяет метод копирования. Вы можете попробовать это в REPL.
scala> case class Foo()
defined class Foo
scala> Foo().copy()
<console>:8: error: value copy is not a member of Foo
Foo().copy()
^
scala> case class Foo(x: Int)
defined class Foo
scala> Foo(0).copy()
res1: Foo = Foo(0)
Есть ли причина, почему компилятор делает это исключение? Я думаю, что это довольно unituitive, и я ожидаю, что каждый класс case определит метод копирования.
Вторая проблема: у меня есть метод def ops: List[Op], и я хотел бы скопировать все ops как ops map { _.copy() }. Как определить метод копирования в значении Op? Я получаю ошибку "слишком много аргументов", если я говорю def copy(): Op. Однако, поскольку все методы copy() имеют только необязательные аргументы: почему это неверно? И как мне это сделать правильно? Сделав еще один метод с именем def clone(): Op и напишите всюду def clone() = copy() для всех классов случаев? Надеюсь, что нет.