Wie teilweise angewandte Funktionen, ein Konstruktor (die eine Funktion von seinen Argumenten für den konstruierten Typen ist), teilweise angewandt werden kann, in diesem Fall:
scala> case class User(val id: Long)(val username: String)
defined class User
scala> val userBuilder = User(123L) _
userBuilder: String => User = <function1>
Hinweis des Typ des resultierenden userBuilder
- es ist eine Funktion von String
(die restlichen Parameter) zu User
nun wie Funktionen teilweise angewendet, können Sie dieses Ergebnis in einen String anwenden können und eine User
Instanz erhalten:
scala> val user = userBuilder("a")
user: User = User(123)
scala> user.username
res1: String = a
Wann ist das nützlich?
Wenn Sie viele Instanzen mit gemeinsamen Werten für eine Teilmenge der Argumente, zum Beispiel konstruieren wollen:
case class Person(lastName: String)(val firstName: String)
class Family(lastName: String, firstNames: List[String]) {
def getMembers: List[Person] = {
val creator = Person(lastName) _ // will be reused for each first name!
firstNames.map(creator)
}
}
Wenn Sie verwenden möchten, ein Argument als Standardwert eines anderen:
case class Measure(min: Int)(val max: Int = min*2)
Measure(5)() // max = 10
Measure(5)(12) // default overridden, max = 12
Wenn Sie implicit
Argumente verwenden möchten, die muss in einem separat wohnen e, letzte Argumentliste der Funktion, wie int der Scala Language Specification (Kapitel 7.2) beschrieben:
Verfahren oder Konstrukteur kann nur eine implizite Parameterliste haben, und es muss die letzte Parameterliste sein, gegeben.
nicht genau - Ihre Antwort kompiliert nicht, Sie sollten 'User (123L) _' schreiben, um den partiell angewendeten Konstruktor zu erhalten. –
Auch wichtig zu beachten, dass der Typ von 'user' hier _not_' User' ist, aber eine Funktion: 'String => User' – Dima
Danke für die Antwort. Ich habe versucht, folgendes zu tun: Fallklasse Benutzer (Val-ID: Lang, implizite val-Repository: UserRepository), aber es hat Kompilierungsfehler, also, wenn ich in die Fallklasse geändert habe Benutzer (val id: Long) (implizite val Repository: UserRepository) - es funktioniert. Aber warum der erste Ansatz nicht funktioniert. Repository-Eigenschaft ist für die Klasse erforderlich, und wie Sie gesagt haben, wenn ich Benutzerklasse ohne zweiten Parameter initialisieren kann, wäre die Klasse inkonsistent. Wie kann ich dieses Problem lösen? – Teimuraz