Ich verstehe, dass ein Verfahren Code wie folgt haben:Was bedeuten mehrere aufeinanderfolgende dicke Pfeile in Methodenparametern in Scala?
def m(p1:Int => Int) ...
Welche dieser Methode bedeutet, nimmt eine p1 Funktion, die ein Int
kehrt Aber während die Play Surfen! Framework-Code fand ich einen Zug mit indecipherable Methoden:
trait Secured {
def username(request: RequestHeader) = request.session.get(Security.username)
def onUnauthorized(request: RequestHeader) = Results.Redirect(routes.Auth.login)
def withAuth(f: => String => Request[AnyContent] => Result) = {
Security.Authenticated(username, onUnauthorized) { user =>
Action(request => f(user)(request))
}
}
/**
* This method shows how you could wrap the withAuth method to also fetch your user
* You will need to implement UserDAO.findOneByUsername
*/
def withUser(f: User => Request[AnyContent] => Result) = withAuth { username => implicit request =>
UserDAO.findOneByUsername(username).map { user =>
f(user)(request)
}.getOrElse(onUnauthorized(request))
}
}
Was bedeutet die f: User => Request[AnyContent] => Result
bedeuten? Auf den ersten Blick sieht es wie eine Methode aus, die eine Funktion r
vom Typ Request zurückgibt; r
gibt dann eine Result
zurück.
Ist das die richtige Annahme?
Ok, cool. Aber warum muss das angegeben werden? Warum kann der Compiler nicht den Typ ableiten, den 'Request' zurückgibt? Edit: vergiss ich, Subtypes von Request könnte verschiedene Arten von Ergebnissen zurückgeben, so dass dies hilfreich ist. –
@ CameronA.Ellis Ich bin mir nicht ganz sicher, ob ich Ihren Kommentar verstehe. Das "Request" -Objekt gibt nichts zurück. Die von 'f' zurückgegebene Funktion, die den Typ' Request [AnyContent] => Result hat, gibt ein 'Result' zurück. Der Rückgabetyp kann nicht vom Typ einer Funktion weggelassen werden, denn dann würde "f" ein "Request" -Objekt zurückgeben - keine Funktion, die ein "Request" -Objekt akzeptiert, was ganz anders ist. – sepp2k
danke für die Klärung. Macht jetzt total Sinn. –