Case class copy() method abstraction.
Posted
by Joa Ebert
on Stack Overflow
See other posts from Stack Overflow
or by Joa Ebert
Published on 2010-05-26T09:16:37Z
Indexed on
2010/05/26
9:21 UTC
Read the original article
Hit count: 296
I would like to know if it is possible to abstract the copy method of case classes. Basically I have something like sealed trait Op
and then something like case class Push(value: Int) extends Op
and case class Pop() extends Op
.
The first problem: A case class without arguments/members does not define a copy method. You can try this in the 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)
Is there a reason why the compiler makes this exception? I think it is rather unituitive and I would expect every case class to define a copy method.
The second problem: I have a method def ops: List[Op]
and I would like to copy all ops like ops map { _.copy() }
. How would I define the copy method in the Op
trait? I get a "too many arguments" error if I say def copy(): this.type
. However, since all copy() methods have only optional arguments: why is this incorrect? And, how do I do that correct? By making another method named def clone(): this.type
and write everywhere def clone() = copy()
for all the case classes? I hope not.
© Stack Overflow or respective owner