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