Betrachten Sie eine abstrakte Klasse, die zwei Eigenschaften definiert
%Vor%Dies ist die Basisklasse für verschiedene Fallklassen wie
%Vor%Ziel: Ich möchte endlich Instanzen der oben genannten Fallklassen auf zwei Arten erstellen können, nämlich
%Vor% Ansatz: Es scheint daher vernünftig, eine Hilfsklasse zu definieren, die has
definiert und mir erlaubt, A
s teilweise zu konstruieren
Problem: Die aktuelle Maschine erlaubt keine Aufrufe wie Bar(1)
, da dies eigentlich ein Aufruf von Bar.apply(1)
ist, dh der Methode apply
, wie sie vom Compiler definiert wurde -generated Objekt Bar
.
Es wäre großartig, wenn ich den Compiler zwingen könnte, das Bar
-Objekt als object Bar extends PartialAConstructor
, wo
Es scheint jedoch nicht möglich zu sein, die Generierung von Begleitobjekten von Fallklassen zu beeinflussen.
Gewünschte Eigenschaften:
Fallklassen: Foo
, Bar
usw. sollten Fallklassen bleiben, weil ich die vom Compiler erzeugten Goodies wie strukturelle Gleichheit, copy
und automatisch generierte Extraktoren verwenden möchte.
"Vollständige" strukturelle Gleichheit: Definieren der Fallklassen als
%Vor% ist keine Option, da die vom Compiler generierte equals
-Methode nur die erste Liste von Argumenten berücksichtigt, und daher würde Folgendes fälschlicherweise gelten:
So wenig Code-Wiederholung wie möglich: Zum Beispiel ist es natürlich möglich, ein
zu definieren %Vor% aber das müsste für jede Fallklasse getan werden, die A
erweitert, das ist Foo
, Bar
etc.
Sie könnten sich stark auf currrying verlassen (und auf die Tatsache, dass Foo.apply
, wie jede Methode, automatisch zu einer Funktion befördert wird) und auf einen kleinen Helfer, um die Syntax zu verbessern:
Dann können Sie tun:
%Vor% Wenn Sie Ihre has
-Methode wirklich verwenden möchten (statt die Funktion direkt anzuwenden), fügen Sie noch eine implizite Klasse hinzu:
und jetzt können Sie tun:
%Vor%Was ist los mit
? %Vor% Sie können auch eine apply
-Methode zum Begleiter hinzufügen, die nur 1 Argument benötigt und die partielle Anwendung für Sie erledigt.
Abgesehen davon gibt es vielleicht eine Möglichkeit, das mit Makros zu tun, die noch nicht veröffentlicht wurden, aber Sie können mit ihnen umgehen Makro Paradies .
Bearbeiten :
Um etwas zu einem Fallklassen-Begleiter hinzuzufügen, tun Sie einfach so, wie Sie es normalerweise tun würden:
%Vor%In der Bewerbung können Sie auch Ihre PartialA oder was auch immer Sie möchten zurückgeben.
Angenommen, Sie möchten die "hat" DSL, und vielleicht möchten Sie es erweiterbar, funktioniert das folgende auch:
%Vor%Es kann einen Weg geben, ein Klassenmakro zu verwenden, um die explizite Companion-Definition vollständig zu beseitigen.
Tags und Links scala object dsl case-class partial-application