2012-12-23 5 views
10

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)) 
    } 
} 

Play! Scala Security

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?

Antwort

16

Was bedeutet das f: Benutzer => Request [AnyContent] => Ergebnis bedeuten? Auf den ersten Blick sieht es wie eine Methode aus, die eine Funktion r vom Typ Request zurückgibt; r gibt dann ein Ergebnis zurück.

f liefert eine Funktion vom Typ Request[AnyContent] => Result, das heißt, eine Funktion, die eine Request[AnyContent] nimmt und gibt eine Result.

Mit anderen Worten: f ist eine Curry-Funktion. Man könnte es als f(user)(request) bezeichnen, um eine Result zurückzubekommen.

+0

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. –

+2

@ 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

+0

danke für die Klärung. Macht jetzt total Sinn. –

1

def withAuth(f: => String => Request[AnyContent] => Result) bedeutet, dass f ist ein Neben name-Parameter, und Sie können so etwas schreiben:

withAuth { 
    logger.info("Here we go") 
    ... 
    chooseTheAction("list") 
} 

wo chooseTheAction eine String nimmt und gibt eine Funktion, um eine Anfrage durchführt, Request[AnyContent] => Result