Verwendung des Konstruktors, wo die Funktion erwartet wird

8

Zwei einfache Klassen, die Int als Argument verwenden:

%Vor%

Ich kann sagen:

%Vor%

Was gut funktioniert und etwas ausführlicher ist:

%Vor%

Wie auch immer Bar (weil es keine Fallklasse ist?) kann nicht im selben Konstrukt verwendet werden:

%Vor%

Gibt es eine spezielle Syntax, um auf einen Konstruktor zu verweisen und die Eta-Erweiterung zu nutzen? List(1,2,3) map {new Bar(_)} scheint etwas verbaler als Foo .

    
Tomasz Nurkiewicz 08.10.2011, 07:53
quelle

2 Antworten

12

Im ersten Fall funktioniert es, weil das Companion-Objekt einer Fallklasse das entsprechende Merkmal FunctionN erweitert. ( object Foo extends (Int => Foo) in Ihrem Beispiel.) Für nicht-fallbezogene Klassen können Sie dies manuell tun:

%Vor%

IMO, es ist besser, mit new Bar(_) zu gehen, da dieses zusätzliche Boilerplate die kleine Prägnanz nicht wert ist.

    
missingfaktor 08.10.2011, 08:20
quelle
1

Da Foo eine Case-Klasse ist, gibt es auch ein Companion-Objekt namens Foo , das die Function1 -Schnittstelle implementiert (hätte der Konstruktor drei Argumente, wäre es die Function3 -Schnittstelle).

    
Theo 08.10.2011 08:30
quelle