Case class copy () - Methode der Abstraktion

Ich würde gerne wissen, ob es möglich ist, zu abstrahieren, die copy-Methode des case-Klassen. Im Grunde habe ich so etwas wie sealed trait Op und dann so etwas wie case class Push(value: Int) extends Op und case class Pop() extends Op.

Das erste problem: Ein Fall Klasse, ohne Argumente/Mitglieder definiert nicht eine copy-Methode. Sie können versuchen, diese in die 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)

Gibt es einen Grund, warum der compiler diese Ausnahme? Ich denke, es ist eher unituitive und ich würde erwarten, dass jeder Fall Klasse zu definieren, die eine copy-Methode.

Das zweite problem: ich habe eine Methode def ops: List[Op] und ich würde gerne alles kopieren ops wie ops map { _.copy() }. Wie würde ich definieren, die die copy-Methode in der Op Eigenschaft? Ich bekomme ein "zu viele Argumente" - Fehler, wenn ich sage def copy(): Op. Da jedoch alle copy () - Methoden haben nur optionale Argumente: warum ist das falsch? Und, wie mache ich das richtig? Durch eine weitere Methode mit dem Namen def clone(): Op und schreiben überall def clone() = copy() für alle der Fall Klassen? Ich hoffe nicht.

Die Antwort auf Ihre Frage, "...ist es moeglich, die copy-Methode des case-Klassen", ignoriert andere Aspekte der Ihre Frage ist: ja. Sie möchten, heraus zu überprüfen, ein Konzept, das als Linsen. Es ist eine große video von Edward Bürgermeister von Linsen in Scala und Scalaz ist eine Bibliothek, die Sie als eine sehr reiche Bibliothek. Es gibt auch eine compiler-plugin (Gebeugt) , generiert die erforderlichen boilerplate anstatt Handschrift. Hoffentlich scalamacros.org wird zu lindern einige dieser Tag bald.

InformationsquelleAutor Joa Ebert | 2010-05-26

Schreibe einen Kommentar