Case类的copy()方法抽象

Joa*_*ert 12 scala copy

我想知道是否有可能抽象出案例类的复制方法.基本上我有类似的东西sealed trait Op,然后像case class Push(value: Int) extends Opcase class Pop() extends Op.

第一个问题:没有参数/成员的案例类没有定义复制方法.你可以在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)
Run Code Online (Sandbox Code Playgroud)

编译器出现此异常的原因是什么?我认为它是相当单一的,我希望每个案例类都定义一个复制方法.

第二个问题:我有一个方法def ops: List[Op],我想复制所有的操作ops map { _.copy() }.我如何在Op特征中定义复制方法?如果我说的话,我会收到"太多参数"的错误def copy(): Op.但是,由于所有copy()方法都只有可选参数:为什么这不正确?而且,我该怎么做呢?通过为所有案例类创建另一个为所有案例类命名def clone(): Op和写入的方法def clone() = copy()?我希望不是.

Dan*_*ral 12

你似乎是混乱copyclone.目标copy是制作一个几乎相同的副本,但改变了一些东西.这可能是什么取决于案例类的参数,因此不可能使它成为一种常见的方法.

如果是 case class X(),拥有一个copy方法没有多大意义,因为没有什么可以改变的.

另一方面, clone是一种Java方法,其目标是生成对象的完美副本,这似乎是您想要的.


Mir*_*ker 9

  1. 对于没有任何参数的case类,编译器生成的复制方法有什么好处?这只会返回一个新的Foo,而不是复制任何东西.
  2. 引用卢卡斯Rytz(我相信他实现了它):
仅当类中没有名为"copy"的成员,直接定义或继承时,才会生成复制方法.

  • 好处显然是一致性的. (16认同)