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.
InformationsquelleAutor Joa Ebert | 2010-05-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ok, ich bin einverstanden. Aber es würde nicht viele Vorteile bringen, weil man nicht wirklich Abstrakt über die copy-Methode.
Und Sie könnte dann mit verschiedenen Instanzen von case-Klassen als nicht-Wert Aufzählungstyp.
InformationsquelleAutor Mirko Stocker
Scheinen Sie zu verwirren
copy
mitclone
. Das Ziel dercopy
eine fast identische Kopie, aber mit etwas geändert. Was, dass etwas sein könnte, hängt von den Parametern der Fall Klasse, so dass es nicht möglich ist, machen es eine gängige Methode.Im Fall von
case class X()
, es macht nicht viel Sinn, um eincopy
Methode, da nichts geändert werden.Auf der anderen Seite
clone
ist eine Java-Methode, deren Ziel ist, perfekte Kopien von einem Objekt, das scheint zu sein, was Sie wollen.Ich bin nicht einverstanden. Klonen wird nicht generiert, für den Fall, Klassen, aber kopieren ist. Und Klonen ist nicht zugänglich für case-Klassen standardmäßig. Meine Absicht mit dieser Frage ging es um die Kopie und paste-Massaker. Geschwindigkeit ist wichtig, damit relfections sind aus dem Spiel. Das Ergebnis? Ich schrieb "override def clone() = kopieren()" und "override def clone() = CaseClass ()", 150+ case-Klassen. IMHO ist dies bei weitem nicht optimal und man hätte alles viel einfacher.
Aber wenn ein Fall Klasse keine Parameter, die jedes Objekt ist gleich zu allen anderen. Außer für interne vars und vals, die nicht kopiert
copy
sowieso.(Unveränderlich) bei Klassen ohne Eigenschaften Sinn machen; Sie sind nur ismorphic der Einheit.
Ja, obwohl ich lieber Fall Objekte. Es ruft
copy
auf einen Fall Klasse ohne Eigenschaften, sehe ich keinen Sinn darin.InformationsquelleAutor Daniel C. Sobral
Als Mirko richtig feststellte, kann man nicht wirklich Abstrakt über die copy-Methode. Ich unterstütze Daniel ist der Ansicht, dass das Klonen kann das sein, was Sie wollen, obwohl ich würde wickeln Sie es mit einigen Helfer-code zu verringern, boilerplate.
Können Sie definieren eine mixin-Merkmal mit copy-Funktionalität und nur mischen Sie es in Ihrem Fall Klassen dann:
So, anstatt das hinzufügen einer identischen Methode jeweils Ihren Fall Klassen, machen Sie Sie verlängern die Helfer-Merkmal, das macht Sie sauberer und spart Ihnen einige Tastenanschläge.
Auf der anderen hand, das Klonen würde keinen Sinn machen, für unveränderliche Objekte, so dass ich ableiten Ihre Klassen mutable Zustand. Ich würde dir raten zu überdenken, wenn Sie wirklich nicht machen Sie unveränderlich, und diese Art von Klonen nur auf last resort. Unveränderbarkeit wird schützen Sie sich vor eine Klasse von Fehlern.
InformationsquelleAutor Przemek Pokrywka
Warum müssen Sie erstellen identischer Kopien von Ihrem Fall Klasse Instanzen? Case-Klassen sind standardmäßig unveränderlich, so kann problemlos geteilt werden.
In jedem Fall, ich glaube nicht, Sie können tun, was Sie Fragen mit default-Parametern:
Den compiler nicht erstellen Methoden mit allen Kombinationen der optionalen Parameter in der Definition der Klasse. Die default-Werte eingefügt werden, in dem Ort, wo die Methode aufgerufen wird.
Wenn Sie nicht brauchen, Wert-Semantik, warum sind Sie mit einer Fall-Klasse?
Pattern-matching zum Beispiel. Eigentlich mag ich alle Ihre Funktionen, aber ich habe von Referenzen zur Gleichheit und dem Wert der Gleichheit als gut. Als misto bereits darauf hingewiesen, dass der compiler nicht erzeugen einer Kopie () - Methode auf alle im Beispiel.
InformationsquelleAutor Ben Lings
Von Ihnen positiv bewertet werden Ben ' s Antwort. Aber was, wenn Sie wollten, so etwas wie dieses:
InformationsquelleAutor huynhjl